‘Maarten van Rossem - De Podcast’ - #331 Textanalysis of the podcast

Author

Alex van Vorstenbosch

Published

February 24, 2023

Analysing the Podcast
De ‘Maarten van Rossem’-podcast is one of the most popular podcasts in The Netherlands, which has produced more than 300 episodes in the past 2 years. In this article, we produce some fun, and hopefully interesting, statistics about the podcast. This is done by collecting all the currently available podcasts from the web, and transcribing them using the newly available Whisper automated speech recognition model by OpenAI. After some initial statistical analysis of the podcast, finish our analysis by extracting topics from podcast using BERTopic, a Topic Modeling pipeline by Maarten Grootendorst. The goal of this project is first of all to have fun analysing the words of Maarten and Tom. I hope you’ll learn something interesting from all this, enjoy!

1 Introduction and Code Setup

Hi! Welcome at the start of our journey through the data of the ‘Maarten van Rossem’ podcast. As you will notice below, I’ve included all the code for this analysis in this document, so you can see exactly how the analysis was performed. Some may find this wonderful, while some may find this more annoying than anything else. To be fair, it does hinder the readability of the article a little. That is why the default setting is to hide the code. However, if you’d like to see all the code, you can click the </> Code tab to the right of the Title, and click Show All Code to set all code chunks to be unfolded and visible.

It’s also good to note, that if you are interested in the source-code of other elements of this project such as the webscraper, you can click View Source in the same tab to visit this project on github.

A final note is that at the top right of the page you will find a small button which you can use to toggle dark-mode for this article.

Alright, I said final note but this time I mean it: This article was written for desktop viewing. It won’t throw errors if you try to read this on a mobile device, but the formatting will be wonky and the interactive figures will be almost impossible to navigate. So if you’re able to, please read this on a desktop device.

Now that we’ve handled these formalities, let’s get started!

Show the code
# Base imports
import os
import re
import pickle
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
from matplotlib.colors import rgb2hex
import plotly.graph_objects as go
import plotly.io as pio
pio.renderers.default='plotly_mimetype+notebook_connected'

# Set the random seed for reproducability
import random
random_seed = 2112
random.seed(random_seed)
np.random.seed(random_seed)

# Set plotting settings
plt.style.use('seaborn-darkgrid')
plt.rcParams['figure.dpi'] = 125
px = 1/plt.rcParams['figure.dpi'] 
figsize= (int(1200*0.9), int(700*0.9)) #px
figsize_inch = (figsize[0]*px, figsize[1]*px)

# For Fitting distributions
from scipy.stats import norm, lognorm, gamma, linregress
from scipy.optimize import curve_fit
from statsmodels.nonparametric.kde import KDEUnivariate
from sklearn.metrics import mean_squared_error

# For simple text processing
from nltk.corpus import stopwords
from nltk.tokenize import RegexpTokenizer, sent_tokenize

# For complex text processing
from sklearn.feature_extraction.text import TfidfVectorizer, CountVectorizer
from sklearn.decomposition import NMF, MiniBatchNMF, LatentDirichletAllocation 
from sklearn.preprocessing import normalize
from bertopic import BERTopic
from umap import UMAP
from hdbscan import HDBSCAN
from sentence_transformers import SentenceTransformer

# For making Wordclouds
from wordcloud import WordCloud

# For neat progress bars
from tqdm import tqdm

# For neat typehinting in Python
from typing import List, Union

# Here we define some usefull utility-functions
def write_pickle(path, object):
    """
    Pickle and save an object.

    Parameters
    ----------
    path : str
        Path to pickled file
    object : any
        An object to pickle
    """    
    with open(path, 'wb') as f:
        pickle.dump(object, f)

def read_pickle(path):
    """
    Read and return a pickled object.

    Parameters
    ----------
    path : str
        Path to pickled file

    Returns
    -------
    any unpickled object(s)
    """
    with open(path, 'rb') as f:
        object = pickle.load(f)
    return object

def read_txt_file(path):
    """
    read text file from path

    Parameters
    ----------
    path : str
        filepath

    Returns
    -------
    text : str
        contents of the file
    """    
    if not os.path.exists(path):
        return np.nan

    with open(path, "r") as f:
        text = f.read()
    return text

1.1 Load the data

Here we load the data, which has been stored in a dataframe. Below the cell, we’ve printed a short example of what the data looks like:

Show the code
data = pd.read_pickle("../extract_data/data.pickle")

# Sort by episode number
data = data.sort_values(["episode"]).reset_index(drop=True)

# Read Corpus
data["text"] = data["txt_path"].transform(lambda path: read_txt_file(path))

# Drop episodes that have not been transcribed yet
data = data.dropna(subset=["text"]).reset_index(drop=True)

# Check if file is a numbered episode
# We also skip the trailer as it is episode 0
data["is_episode"] = data["episode"].transform(lambda num: num > 0)

print_cols = ["titles", "date", "duration", "episode"]
pd.set_option('display.max_colwidth', 40)
data.tail(3)
titles sources date duration episode mp3_path txt_path text is_episode
341 #328 - Sorry voor de slaven https://anchor.fm/s/21c734c4/podcast... 2022-12-18 00:29:59 328 ../data/audio/#328 - Sorry voor de s... ../data/text/file:#328 - Sorry voor ... Al die mensen die niet kunnen luiste... True
342 #329 - Pak de macht! https://anchor.fm/s/21c734c4/podcast... 2022-12-20 00:41:16 329 ../data/audio/#329 - Pak de macht!.mp3 ../data/text/file:#329 - Pak de mach... Oh, oh, oh. Ja, wat een idee. Een st... True
343 #330 - Gouden Eeuw https://anchor.fm/s/21c734c4/podcast... 2022-12-22 01:16:39 330 ../data/audio/#330 - Gouden Eeuw.mp3 ../data/text/file:#330 - Gouden Eeuw... Het was een revolutie, zoals de hele... True

2 ‘Goed Nieuws’ - There is always a new episode around the corner

Let’s get started with our analysis! There are so many points were we could possibly start, so let’s start with analysing the dataframe I prepared for us.

From the dataframe we can see that the number of ‘episodes’ on the channel is:

344 episodes.

Great! But hold on, that’s not quite right… I thought we were on something like episode 320? The reason for all the extra episodes is that the podcast-channel also includes specials, trailers, and the likes:

Show the code
data_full = data.copy()

# create a simple mask for getting only the numbered episodes
is_ep = (data.is_episode==True)
data[~is_ep][print_cols].to_html(index=False)
titles date duration episode
Special: Europa 2021-12-07 00:48:14 -9999
Special: Koude Oorlog (deel 2) 2021-10-14 00:31:19 -9999
Special: Afghanistan 2021-08-16 00:23:56 -9999
Special: 9-11 2021-09-09 00:40:08 -9999
Bonus: Dominantie Europa 2021-01-12 00:06:37 -9999
Bonus: Melk 2021-01-11 00:02:34 -9999
Special: Koude Oorlog (deel 1) 2021-10-06 00:40:45 -9999
Jaaroverzicht 2021 2021-12-31 00:52:03 -9999
Veranderingen in de wereldmacht 2022-04-16 00:31:33 -9999
Nieuwe wereldorde 2022-04-18 00:33:28 -9999
Capitool bestorming 2022-01-06 00:48:22 -9999
Goed nieuws 2022-04-15 00:00:05 -9999
De val van de Sovjet-Unie 2022-04-17 00:34:52 -9999
Maarten en Tom op RTL 4 2022-11-16 00:09:31 -9999
#0 - Trailer Maarten van Rossem De Podcast 2020-05-17 00:00:42 0

These episodes are given the number -9999 to indicate that they are not regular numbered episoded. For our analysis, it is better to ignore these specials, as they are not representative for typical podcast episodes.

When we remove these episodes we have 329 episodes. However, the latest episode is 330

We are missing 1 episode, episode ‘#116 - Joe Biden: 1 jaar’ as this is the only episode that was released exclusively for paid subscribers to the podcast.

The collapsible cell below is something you’ll encounter more often in this article. It’s a convenient way for us to put interesting results into the file, while making sure we don’t create massive clutter in the process.

titles date duration episode
#1 - De terminale arrogantie van Wopke Hoekstra 2020-06-07 00:25:14 1
#2 - Heerlijk! Een zomer zonder festivals 2020-06-07 00:29:11 2
#3 - Je moet strakke dames van middelbare leeftijd hebben 2020-06-07 00:32:10 3
#4 - Maarten van Rossem drinkt elke nacht bier 2020-09-11 00:51:17 4
#5 - Hoe HOGER de belastingen, hoe GELUKKIGER de mensen 2020-09-24 00:49:01 5
#6 - Dansende Banaan 2020-10-06 00:47:39 6
#7 - Hoorcollege Maarten van Rossem: Wint de verliezer wéér de verkiezingen in de VS? 2020-10-11 01:05:27 7
#8 - Ajuu 2020-10-19 00:39:02 8
#9 - Is Maarten een kaviaarsocialist? 2020-10-31 00:41:58 9
#10 - Dagboek 2020-11-04 00:47:35 10
#11 - Wie Is Akwasi? 2020-11-14 00:41:04 11
#12 - Maarten wil vaccin in elke bil 2020-11-21 00:38:33 12
#13 - Maarten rent voor zijn leven 2020-11-27 00:53:54 13
#14 - Bevel is bevel 2020-12-04 00:46:58 14
#15 - Wopke 2020-12-12 00:39:20 15
#16 - Te laat 2020-12-18 00:40:31 16
#17 - Evert 2020-12-24 00:29:00 17
#18 - Onderbroek 2020-12-26 00:31:12 18
#19 - Rolmodel 2021-01-01 00:57:27 19
#20 - Trump's Podcast Palace 2021-01-08 00:45:17 20
#21 - Zelfredzaamheid 2021-01-16 00:53:54 21
#22 - De Slimste 2021-01-22 01:09:00 22
#23 - Vroege dood 2021-01-29 01:01:15 23
#24 - Kinderen 2021-02-05 00:54:24 24
#25 - Seks met zwarte slavin 2021-02-12 00:54:28 25
#26 - Napoleon 2021-02-19 00:45:27 26
#27 - Postzegels 2021-02-26 00:50:54 27
#28 - Duitsland (deel 1) 2021-03-06 01:02:58 28
#29 - Coronaprik & Duitsland (deel 2) 2021-03-13 01:06:49 29
#30 - Vaccinvoordringer?! 2021-03-20 01:10:52 30
#31 - Tragiek van neoliberalisme 2021-03-27 01:07:49 31
#32 - Reflecteren 2021-04-03 01:10:02 32
#33 - Flikker nou op 2021-04-10 01:16:57 33
#34 - De Beste 2021-04-17 01:08:25 34
#35 - De Sigaar van Bill 2021-04-24 01:13:07 35
#36 - Terrasje 2021-05-01 00:49:01 36
#37 - Terreur 2021-05-08 00:47:53 37
#38 - 'Neger in Witte Huis' 2021-05-15 01:30:46 38
#39 - Wappies 2021-05-22 01:10:24 39
#40 - Domme schapen 2021-05-29 01:41:15 40
#41 - Pislucht 2021-06-05 01:19:11 41
#42 - Omtzigt ongeschikt 2021-06-12 00:54:13 42
#43 - Linkse lul 2021-06-19 00:50:33 43
#44 - Seksboekjes 2021-06-26 00:46:24 44
#45 - Klote voetbal 2021-07-03 01:37:50 45
#46 - Besmet met deltavariant 2021-07-08 00:47:07 46
#47 - Kogel voor Peter 2021-07-10 01:00:36 47
#48 - Dom, dommer, domst 2021-07-15 00:47:02 48
#49 - Populisme 2021-07-17 00:40:21 49
#50 - Asociale eikel 2021-07-21 00:47:54 50
#51 - Klimaatontkenner 2021-07-24 00:44:43 51
#52 - Bedreigd 2021-07-28 00:55:17 52
#53 - Lekker ergeren 2021-07-31 00:46:47 53
#54 - Hitler 2021-08-04 00:48:50 54
#55 - Negeer de wet 2021-08-07 00:47:33 55
#56 - Der Führer schläft 2021-08-11 00:48:55 56
#57 - Ontgroening 2021-08-14 00:47:11 57
#58 - Poesje 2021-08-18 00:43:10 58
#59 - Polen 2021-08-21 00:49:27 59
#60 - Sukkeltje 2021-08-25 00:40:49 60
#61 - Vliegschaamte 2021-08-28 00:46:09 61
#62 - Netflix 2021-08-29 00:56:05 62
#63 - Verkrachter 2021-09-01 00:45:24 63
#64 - Vaccinatiedwang 2021-09-04 00:51:50 64
#65 - BBB-mevrouw 2021-09-08 00:48:15 65
#66 - Bin Laden wint 2021-09-11 00:48:28 66
#67 - Joden 2021-09-15 00:47:04 67
#68 - Fascist 2021-09-18 00:49:19 68
#69 - Rutte kust Kaag 2021-09-19 00:31:20 69
#70 - Auto 2021-09-21 00:49:20 70
#71 - Aanval 2021-09-25 00:45:22 71
#72 - Amsterdam 2021-09-26 00:35:35 72
#73 - Welvaartsbuikje 2021-09-28 00:55:00 73
#74 - Steenkolen Engels 2021-10-02 00:51:14 74
#75 - Lullepot 2021-10-04 00:48:00 75
#76 - Facebook 2021-10-09 00:44:58 76
#77 - File 2021-10-12 00:31:54 77
#78 - Joe York 2021-10-16 00:57:07 78
#79 - Onhandig 2021-10-18 00:29:59 79
#80 - Lijstjes 2021-10-20 00:28:58 80
#81 - Provinciaal 2021-10-23 00:30:38 81
#82 - Jezus 2021-10-24 00:36:31 82
#83 - Mini 2021-10-27 00:36:44 83
#84 - China 2021-10-30 00:30:31 84
#85 - Xi Jinping 2021-10-31 00:39:39 85
#86 - Per seconde wijzer 2021-11-03 00:31:07 86
#87 - Maanlanding 2021-11-06 00:46:50 87
#88 - Verveling 2021-11-08 00:35:18 88
#89 - Het OV 2021-11-10 00:32:48 89
#90 - Zeikneus 2021-11-12 00:31:30 90
#91 - Seksprofessor 2021-11-14 00:40:50 91
#92 - Pokémon 2021-11-16 00:39:03 92
#93 - Lijstduwer 2021-11-18 00:31:08 93
#94 - Trippel Trappel 2021-11-20 00:54:48 94
#95 - Gerri Eickhof 2021-11-21 00:30:36 95
#96 - Kneusje Baudet 2021-11-23 00:31:05 96
#97 - Duurzaam gelul 2021-11-25 00:30:30 97
#98 - Wildplassen 2021-11-27 00:32:53 98
#99 - Vrouwen 2021-11-29 00:31:30 99
#100 - Kolonie 2021-11-30 00:32:38 100
#101 - Vietnamoorlog 2021-12-03 00:29:57 101
#102 - Schelden 2021-12-04 00:22:50 102
#103 - Comeback 2021-12-10 00:44:56 103
#104 - Beste Mensen 2021-12-14 00:32:20 104
#105 - Peace with Honor 2021-12-16 00:33:04 105
#106 - Max Verstappen 2021-12-18 00:31:25 106
#107 - Positief getest 2021-12-21 00:38:59 107
#108 - Jeugd in Wageningen 2021-12-23 00:39:13 108
#109 - Cancelcultuur 2021-12-25 00:35:29 109
#110 - Drugs 2021-12-28 00:42:00 110
#111 - Top 2000 2021-12-30 00:30:32 111
#112 - Loterij 2022-01-01 00:37:48 112
#113 - LTS zwakstroom 2022-01-04 00:26:26 113
#114 - Nieuw kabinet 2022-01-08 00:40:33 114
#115 - Militaire dienst 2022-01-11 00:40:10 115
#117 - Seksueel wangedrag 2022-01-15 00:35:38 117
#118 - Valt Poetin Oekraïne binnen? 2022-01-18 00:35:22 118
#119 - Amerikaanse hoogmoed 2022-01-20 01:14:19 119
#120 - BOOS 2022-01-22 00:36:52 120
#121 - Poetin valt niet aan 2022-01-25 00:33:06 121
#122 - Geopolitiek 2022-01-27 00:35:10 122
#123 - Linda de Mol 2022-01-29 00:47:41 123
#124 - Herinnert u zich deze nog? 2022-02-01 00:43:11 124
#125 - Kernwapen 2022-02-03 00:50:55 125
#126 - Leven zonder Google Maps 2022-02-05 00:37:18 126
#127 - Bedreiging voor China 2022-02-08 00:31:28 127
#128 - Pijpen 2022-02-10 00:40:10 128
#129 - Russische blufpoker 2022-02-12 00:33:29 129
#130 - Versoepelen 2022-02-15 00:32:48 130
#131 - 🇺🇸 USA Roadtrip I 2022-02-17 00:38:01 131
#132 - 🇺🇸 USA Roadtrip II 2022-02-18 00:34:52 132
#133 - Biden blaft maar bijt niet 2022-02-19 00:36:02 133
#134 - Lil' Kleine 2022-02-21 00:34:30 134
#135 - Hij ziet ze vliegen 2022-02-22 00:38:42 135
#136 - Censuur 2022-02-24 00:19:01 136
#137 - Oorlog 2022-02-26 00:33:50 137
#138 - Escalatie 2022-02-27 00:34:02 138
#139 - Lichtpuntjes 2022-03-01 00:31:25 139
#140 - Wie stopt Poetin? 2022-03-02 00:23:03 140
#141 - Spijt 2022-03-04 00:33:40 141
#142 - Speel Rusland en China uit elkaar 2022-03-05 00:30:12 142
#143 - Bloedbad 2022-03-06 00:27:30 143
#144 - Poetin vs Mussolini 2022-03-08 00:40:24 144
#145 - Russisch perspectief 2022-03-09 00:21:07 145
#146 - Verhaal van Nederland 2022-03-11 00:23:17 146
#147 - Ontroerd 2022-03-13 00:30:01 147
#148 - Stemrecht 2022-03-14 00:15:43 148
#149 - Kremlin trekpop 2022-03-15 00:28:48 149
#150 - Komt er vrede? 2022-03-16 00:25:18 150
#151 - Is Poetin der Führer? 2022-03-17 00:24:10 151
#152 - Kiezer sloopt democratie 2022-03-18 00:26:37 152
#153 - Oliecrisis 2022-03-19 00:23:10 153
#154 - Voorkeurstem 2022-03-21 00:26:48 154
#155 - Wanneer grijpt NAVO in? 2022-03-22 00:24:03 155
#156 - Zorgt Poetin voor babyboom? 2022-03-23 00:22:08 156
#157 - Sorry Gijp 2022-03-23 00:26:36 157
#158 - Pim Fortuyn 2022-03-25 00:24:14 158
#159 - Sywert & Hugo 2022-03-26 00:27:32 159
#160 - De tank 2022-03-28 00:31:32 160
#161 - Annexatie van Brabant 2022-03-29 00:30:15 161
#162 - Churchill 2022-03-30 00:38:09 162
#163 - Zelensky 2022-03-31 00:31:37 163
#164 - Uitweg uit oorlog 2022-04-02 00:30:39 164
#165 - Is democratie beste systeem? 2022-04-03 00:32:12 165
#166 - Verruwing 2022-04-04 00:37:55 166
#167 - Held 2022-04-05 00:42:22 167
#168 - Mailtjes van Hugo 2022-04-06 00:30:43 168
#169 - Pechgeneratie 2022-04-07 00:30:05 169
#170 - Cash 2022-04-09 00:28:33 170
#171 - Propaganda 2022-04-10 00:30:38 171
#172 - Geneefse Conventie 2022-04-11 00:34:57 172
#173 - Gifgas 2022-04-12 00:35:18 173
#174 - Inloggen, uitloggen 2022-04-13 00:30:22 174
#175 - Cocaïne 2022-04-14 00:34:29 175
#176 - Deze wapens gebruikt Oekraïne 2022-04-19 00:30:11 176
#177 - Een nieuwe ijstijd 2022-04-20 00:34:07 177
#178 - De enige Nederlandse paus 2022-04-21 00:35:58 178
#179 - Na de moord 2022-04-22 00:27:34 179
#180 - Schiphol 2022-04-23 00:30:41 180
#181 - Duitsland schaamt zich 2022-04-24 00:27:46 181
#182 - Is Kaag nog betrouwbaar? 2022-04-25 00:27:05 182
#183 - Thorbecke 2022-04-26 00:31:46 183
#184 - Monarchie 2022-04-27 00:13:57 184
#185 - Staatsgreep 2022-04-28 00:27:58 185
#186 - Elon Musk 2022-04-29 00:13:23 186
#187 - Hebben we relatie met Rusland zelf verpest? 2022-04-30 00:26:31 187
#188 - Gitzwart scenario Oekraïne 2022-05-01 00:25:21 188
#189 - Nazi's vs Russen 2022-05-02 00:25:02 189
#190 - LHBTI+'ers 2022-05-03 00:21:19 190
#191 - Kogel van links 2022-05-04 00:18:18 191
#192 - Onafhankelijk 2022-05-05 00:20:02 192
#193 - Sis van Rossem 2022-05-08 00:41:20 193
#194 - Poetins toespraak 2022-05-09 00:21:20 194
#195 - De media 2022-05-10 00:34:17 195
#196 - Johan Derksen 2022-05-11 00:33:55 196
#197 - Afscheid 2022-05-13 00:24:38 197
#198 - Wat ging er mis in Oekraïne? 2022-05-15 00:31:09 198
#199 - Vandaag Inside 2022-05-16 00:20:46 199
#200 - Schuilkelder 2022-05-17 00:20:04 200
#201 - Verrot en beschimmeld 2022-05-18 00:22:29 201
#202 - Sms'jes van Mark 2022-05-20 00:18:43 202
#203 - Intellectueel gelul 2022-05-21 00:24:25 203
#204 - Hoe Poetin radicaliseerde 2022-05-23 00:31:12 204
#205 - Het masterplan van Poetin 2022-05-24 00:23:27 205
#206 - Hemelvaart 2022-05-25 00:26:47 206
#207 - Liefdesbaby van Thierry 2022-05-26 00:29:52 207
#208 - Amerikaanse wapencultuur 2022-05-28 00:27:28 208
#209 - Onbeleefde hufter 2022-05-30 00:23:40 209
#210 - Volkswagen busje 2022-05-31 00:29:25 210
#211 - Onderhandelen met Poetin 2022-06-01 00:29:34 211
#212 - Keerzijde van macht 2022-06-02 00:25:59 212
#213 - Dienstplicht 2022-06-03 00:27:25 213
#214 - Erfenis van de nazi's 2022-06-04 00:28:00 214
#215 - Schiphol ellende 2022-06-06 00:26:19 215
#216 - Klimaat Illusie 2022-06-07 00:29:59 216
#217 - Geen actieve herinnering 2022-06-08 00:22:50 217
#218 - Rekening betaald 2022-06-09 00:30:42 218
#219 - Boeren 2022-06-11 00:27:17 219
#220 - Verhoren Capitoolbestorming 2022-06-13 00:26:02 220
#221 - Zo win je de oorlog 2022-06-15 00:27:48 221
#222 - Einde aan globalisering? 2022-06-16 00:38:10 222
#223 - Spaargeld 2022-06-18 00:22:33 223
#224 - Sophie Hermans 2022-06-19 00:20:28 224
#225 - Vakantie is een ziekte 2022-06-21 00:26:40 225
#226 - België 2022-06-22 00:27:28 226
#227 - Battle of Britain 2022-06-24 00:33:58 227
#228 - Abortus 2022-06-25 00:23:58 228
#229 - Hufters, die boeren! 2022-06-28 00:30:32 229
#230 - Oorlog met boeren 2022-07-02 00:31:29 230
#231 - Yvonne Coldeweijer 2022-07-04 00:25:33 231
#232 - De Tour 2022-07-07 00:24:18 232
#233 - Twee levens gered 2022-07-09 00:25:42 233
#234 - Boris Johnson 2022-07-10 00:23:04 234
#235 - Telefoon 2022-07-12 00:27:55 235
#236 - Met de trein 2022-07-14 00:20:52 236
#237 - Noord- en Zuid-Korea 🇰🇷 2022-07-15 00:25:42 237
#238 - Op reis 2022-07-16 00:25:51 238
#239 - Marcel van Roosmalen 2022-07-19 00:21:15 239
#240 - Dier gedood 2022-07-20 00:18:46 240
#241 - Draghi weg, Rutte blijft 2022-07-22 00:16:06 241
#242 - Met dank aan Hitler 2022-07-23 00:32:08 242
#243 - De hel die Schiphol heet 2022-07-24 00:38:03 243
#244 - De val van Rutte 2022-07-26 00:36:30 244
#245 - Ruzie op vakantie 2022-07-28 00:33:19 245
#246 - Achter de schermen 2022-07-30 00:33:23 246
#247 - Haatmail 2022-07-31 00:32:54 247
#248 - Mark Rutte: de recordpremier 2022-08-02 00:31:56 248
#249 - Provoceren 2022-08-04 00:30:02 249
#250 - Nieuwe oorlog 2022-08-06 00:29:55 250
#251 - Kamervragen 2022-08-07 00:33:02 251
#252 - Droog, droger, droogst 2022-08-09 00:33:14 252
#253 - Studententijd 2022-08-11 00:32:46 253
#254 - Ondankbare honden 2022-08-12 00:22:21 254
#255 - Herverkiezing Trump 2022-08-14 00:26:05 255
#256 - ASML's Chipoorlog 2022-08-16 00:28:18 256
#257 - U wordt armer 2022-08-18 00:28:01 257
#258 - Noem mij maar 'hen' 2022-08-20 00:26:50 258
#259 - Bom onder kabinet? 2022-08-21 00:32:08 259
#260 - Mislukte aanslag op Doegin 2022-08-22 00:06:54 260
#261 - Blunders 2022-08-23 00:25:25 261
#262 - Dunning-Kruger effect 2022-08-25 00:30:05 262
#263 - Primeur 2022-08-27 00:21:44 263
#264 - Asielzoeker in huis 2022-08-28 00:32:04 264
#265 - Festival-verslaafd 2022-08-30 00:33:40 265
#266 - James Webb-telescoop 2022-09-01 00:55:48 266
#267 - De baard van Maarten 2022-09-03 00:42:06 267
#268 - Keerzijde van Max' succes 2022-09-04 00:26:57 268
#269 - Tragische ondergang 2022-09-06 00:36:04 269
#270 - Gas als Wapen 2022-09-08 00:29:18 270
#271 - Verheven boven het volk 2022-09-10 00:21:43 271
#272 - The Queen 👑 2022-09-11 00:36:05 272
#273 - Opmars Oekraïne 2022-09-13 00:29:38 273
#274 - Wie is de NSB'er? 2022-09-15 00:30:39 274
#275 - Staken loont 2022-09-17 00:29:53 275
#276 - Begrafenis van de eeuw 💀 2022-09-18 00:31:20 276
#277 - Mocro's ontvoeren Rutte 2022-09-20 00:33:07 277
#278 - Operatie Market Garden 2022-09-22 00:42:48 278
#279 - Poetins Waterloo 2022-09-24 00:34:32 279
#280 - Mobilisatie chaos 2022-09-26 00:35:17 280
#281 - Toekomst voorspellen 2022-09-27 00:39:46 281
#282 - Knettergek 2022-09-29 00:27:52 282
#283 - Derde Wereldoorlog 2022-10-01 00:35:48 283
#284 - Mes in je rug 2022-10-02 00:32:19 284
#285 - Veiligheidsdilemma 2022-10-04 00:25:39 285
#286 - Scheiße 2022-10-06 00:33:16 286
#287 - Rode knop 2022-10-08 00:40:12 287
#288 - Poetins zelfmoord 2022-10-09 00:28:41 288
#289 - Totale vernietiging 2022-10-11 00:31:51 289
#290 - Bel Remkes 2022-10-13 00:34:14 290
#291 - Grootste gevangenis ter wereld 2022-10-15 00:32:42 291
#292 - Profiteren van ellende 2022-10-16 00:46:58 292
#293 - Cubacrisis 2022-10-18 00:35:32 293
#294 - Fittie met Gijp 2022-10-20 00:38:59 294
#295 - Vakantie 2022-10-22 00:47:17 295
#296 - VK stort in 2022-10-23 00:40:55 296
#297 - De onderbuik 2022-10-25 00:44:01 297
#298 - Complotdenkers 2022-10-27 00:34:25 298
#299 - Zelfvernietiging 2022-10-29 00:31:33 299
#300 - Cocaïne legaliseren 2022-10-30 00:34:54 300
#301 - Klimaatflop 2022-11-01 00:36:27 301
#302 - Moord op Poetin 2022-11-03 00:37:09 302
#303 - Excuses maken 2022-11-05 00:41:18 303
#304 - Knuffelen met China 2022-11-06 00:31:47 304
#305 - Midterms 2022-11-08 00:35:05 305
#306 - Tank in de oorlog 2022-11-10 00:34:29 306
#307 - Vernedering 2022-11-12 00:41:19 307
#308 - Trump gaat eraan! 2022-11-13 00:39:50 308
#309 - VVD-implosie 2022-11-15 00:36:56 309
#310 - Aanval op Kremlin 2022-11-17 00:31:36 310
#311 - Maartens wens voor hij doodgaat 2022-11-19 00:37:04 311
#312 - Matthijs van Nieuwkerk 2022-11-20 00:32:32 312
#313 - Trumps ondergang 2022-11-22 00:40:52 313
#314 - Invasie van Taiwan 2022-11-24 00:48:39 314
#315 - Totale halvegaren 2022-11-26 00:41:09 315
#316 - Eureka! 2022-11-27 00:45:24 316
#317 - Slavernij gelul 2022-11-29 00:35:34 317
#318 - Grote loser 2022-12-01 00:37:57 318
#319 - Radioactieve straling 2022-12-03 00:36:12 319
#320 - Vichy-regime 2022-12-04 00:33:42 320
#321 - Energietransitie 2022-12-06 00:34:40 321
#322 - Etterende zweer 2022-12-08 00:41:36 322
#323 - Uitgeschakeld! 2022-12-10 00:24:52 323
#324 - Coup 2022-12-11 00:40:56 324
#325 - Bevelhebber van Europa 2022-12-13 00:40:52 325
#326 - De Wet van Faraday 2022-12-15 00:39:03 326
#327 - ChatGPT 2022-12-17 00:36:16 327
#328 - Sorry voor de slaven 2022-12-18 00:29:59 328
#329 - Pak de macht! 2022-12-20 00:41:16 329
#330 - Gouden Eeuw 2022-12-22 01:16:39 330

So as you may have seen above, the first real episode was:

Show the code
data.sort_values("date").iloc[0:1][print_cols].to_html()
titles date duration episode
0 #1 - De terminale arrogantie van Wopke Hoekstra 2020-06-07 00:25:14 1

That’s quite the title! Maarten and Tom are not afraid to speak their mind, that’s for sure! So the first episode was released on the 7th of June 2020. This means, that the podcast has been running for a total of:

928 days.

For the loyal listeners, that’s good new! As we have 330 episodes at the time of writing. It means that the average waiting time for a new episode is only 2.82 days! That is more than 2 episodes per week over the span of 2.5 years, wow!

It does probably help that Maarten and Tom can talk about pretty much anything, given that they are both a history and a current affairs podcast. However, releasing many episodes doesn’t mean a lot if there is only little content in each episode. Now, I personally am very satisfied with amount of content released by Maarten and Tom, but perhaps we can quantify it? I wonder how much talking they actually do per episode? Let’s find out in the next section!

3 ‘Beste mensen’ - The rate at which content is being released has tripled!

Let’s slowly start wading a little deeper into our sea of data: ‘the contents of the episodes’. I’ve used the Whisper deep neural network model to transcribe all the episodes of the podcast into written text documents. It’s really quite perplexing how well this works. It took about 3 days of GPU time to transcribe all episodes of the podcast. Luckily for me, it was a rather cold weekend, so I could use these calculations the heat my appartement a little. If you have some experience with Python and/or the commandline, it’s possible to run the software on pretty much any computer, so I would advice you to see for yourself how good the results are.

There is always room for improvement

While the results are really impressive, they are of course not perfect. The Word-Error-Rate (WER) for Dutch was estimated at 6.7%. Depending on the context, this WER might be higher or lower. For example, Whisper struggles with processing the episode jingle “Met van Rossem. Kunt u mij horen?”, as demonstrated by this short selection of transcription examples:

  • Met verlossem. Kunt u bijhouden?
  • Met Verlossum. Kunt u mij horen?
  • Het verhorsum. Kunt u mij horen?
  • Het is van Lawson, kunt u mij horen?

This is something you will see more often in this analysis. My interpretation of why these errors happen is this: Whisper tries to use both the spectrogram of the audio as well as the textual context to generate the transcription, but if there is little relevant context to go by, the model needs to make an essentially ‘random’ guess to what could be meant. This is of course the case at for the start-of-episode jingle as it has no relevant context. Also, names are difficult without context. This is almost always the case for the names of people, except for example famous political figures which would have been included in the training data. Finally, the music and singing might further confuse the model.

3.1 How much content is there in each episode?

We could have a long discussion on what we consider to be content and how we want to measure it. Content as an abstract concept is hard to measure, so we just take the number of words spoken as a proxy for the content of each episode. This is easily understandable to anybody, has a clear and direct link to ‘content’, and best of all: this is easily visualised with a histogram!

Show the code
tokenizer = RegexpTokenizer(r"\w+")


def get_length(text):
    """
    Calculates length of a text by counting the number of tokens.

    Parameters
    ----------
    text : str
        Text to process.

    Returns
    -------
    _ : int
        Length of text.
    """
    tokens = tokenizer.tokenize(text)
    return len(tokens)


# Words-per-Episode
data["WPE"] = data["text"].transform(lambda text: get_length(text))
data_full["WPE"] = data_full["text"].transform(lambda text: get_length(text))


def plot_lengths_histogram(data, title, bins=12):
    """
    Plot and show a figure of the distribution of episode lenghts in a histogram.

    Parameters
    ----------
    data : pd.DataFrame
        Information about the episodes.
    title : str
        Second part of the figure title.
    bins : int, optional
        Number of bins in the histogram, by default 12
    """
    plt.figure(figsize=figsize_inch)
    plt.hist(data["WPE"], bins, edgecolor="#EAEAF2", linewidth=1, align="mid")
    plt.title(f"Length of Podcast in Words-Per-Episode - {title}")
    plt.xlabel("# of Words")
    plt.ylabel("Counts")
    plt.tight_layout()
    plt.show()


plot_lengths_histogram(
    data_full, title="All released episodes (specials included)", bins=20
)

Figure 1: The distribution of Words-per-Episode for all the content released as part of the podcast

As we can see in Figure 1 the content is quite varied. Some episodes have almost 16.000 words, while others have only about 2000. But on the whole, most episodes have around 6.000 words. As it turns out, the episodes with the most words are typically the specials, which is not suprising as these are also the longest episodes.

Plotting a histogram of course means that we aggregate our data into bins. This is easy to interpret but also means we are throwing away information. Another fun way to visualize the content, is to plot all the individual datapoints over time. Will we be able to spot any interesting trends?

Show the code
data["duration-s"] = pd.to_timedelta(data["duration"]).dt.total_seconds()
data["duration-m"] = data["duration-s"] / 60.0


def plot_wpe_over_time(data):
    """
    Plot and show a figure of the Words per Episode over Time on one axis and the Duration over Time on the other axis.

    Parameters
    ----------
    data : pd.DataFrame
        Information about the episodes.
    """
    fig, ax = plt.subplots(figsize=figsize_inch)
    plt.title("Words-per-Episode and Episode Duration")
    ax.plot(data["date"], data["WPE"], alpha=0.5, label="Words-per-Episode")
    ax.set_xlabel("Date")
    ax.set_ylabel("Words_per_Episode (#)")
    ax.scatter(data["date"], data["WPE"], s=5, label="Individual datapoints")
    plt.xticks(rotation=70)
    ax.xaxis.set_major_locator(mdates.MonthLocator())
    ax.xaxis.set_major_formatter(mdates.DateFormatter("%Y-%b"))

    # second y-axis
    ax2 = ax.twinx()
    ax2.plot(data["date"], data["duration-m"], c="r", alpha=0.5, label="Duration")
    ax2.set_ylabel("Episode Duration (minutes)")

    # collect labels for legend
    lines, labels = ax.get_legend_handles_labels()
    lines2, labels2 = ax2.get_legend_handles_labels()
    ax2.legend(lines + lines2, labels + labels2, loc=0)


plot_wpe_over_time(data.sort_values(by=["date", "episode"]))

Figure 2: The distribution of Words-per-Episode over time, shown together with the duration of episodes over time. A clear trend is visible where episodes at the start of the podcast lasted more than ~50 minutes, while in the second half of the podcast episode duration dropped to around ~30 minutes. At the same time we can see that the rate at which episodes were released increased rapidly, the density of datapoints increases by a lot!

We see an interesting pattern. Figure 2 shows us that the podcast started with a few long episodes per month, and slowly evolved into many shorter episodes per week. I believe that when Maarten and Tom started recording the podcast, they only released one episode per week on saturdays. Then they started spliting recordings into multiple episodes, and these days, they record multiple times a week.

So the episodes became shorter, but also more frequent. The question is which of the two had a bigger effect? Are we getting less or more content each week?

Before we answer that question, I would like to revisit our histogram, as Figure 2 has given us some usefull information on how to filter our data to make a histogram

3.1.1 ‘Doe maar (log)normaal…’ - Fitting statistical distributions to the histogram

We could see from the previous figure, that the structure of episodes has changed quite a bit over time. The early episodes were typically around an hour long, and in the summer of around 2021 this was brought back to around ~40 minutes. It is interesting to note that we can actually fit statistical distributions to the variation that we see, as we will do in the following figure. We select all episodes released after August 1st 2022, as the release schedule and episode length become more consistent after this point.

Show the code
def plot_lengths_histogram_fit(data, title, bins=12):
    """
    Plot a histogram of episode lengths fit statistical distributions.

    Parameters
    ----------
    data : pd.DataFrame
        Information about the episodes.
    title : str
        Second part of the figure title.
    bins : int, optional
        Number of bins in the histogram, by default 12

    Returns
    -------
    model_params : list
        List with the fit parameters for the statistical models.
    """
    model_params = []
    plt.figure(figsize=figsize_inch)
    plt.hist(data["WPE"], bins, density=True, edgecolor="#EAEAF2", linewidth=1)

    # fit the lognormal
    params = lognorm.fit(data["WPE"], floc=0)
    model_params.append(params)
    x = np.linspace(0, data["WPE"].max(), 100)
    lognormal_fitted = lognorm.pdf(x, *params)
    plt.plot(
        x,
        lognormal_fitted,
        color="g",
        label="Lognormal Distribution:\n"
        + r"  -$s$="
        + f"{round(params[0],2)}\n  -loc={round(params[1],2)}\n  -scale={round(params[2],2)}",
    )

    # fit the gamma
    params = gamma.fit(data["WPE"], floc=0)
    model_params.append(params)
    x = np.linspace(0, data["WPE"].max(), 100)
    gamma_fitted = gamma.pdf(x, *params)
    plt.plot(
        x,
        gamma_fitted,
        color="r",
        label="Gamma Distribution:\n"
        + r"  -$\alpha$="
        + f"{round(params[0],2)}\n  -loc={round(params[1],2)}\n  -scale={round(params[2],2)}",
    )

    plt.title(f"Length of Podcast in Words-Per-Episode  - {title}")
    plt.xlabel("# of Words")
    plt.ylabel("Probability Density")
    plt.legend()
    plt.tight_layout()
    plt.show()
    return model_params


data_second_half = data[data["date"] > "2021-08-1"]
model_params = plot_lengths_histogram_fit(
    data_second_half, title="Fitted Lognormal and Gamma Distribution", bins=20
)

Figure 3: Fitting a Gamma and Lognormal distribution to the Words-per-Episode of the podcast shows that some interesting patterns emerge in the data. Both distributions seem plausible for the podcast.

If we take the full distribution of episodes, the resulting distribution becomes bimodal. This essentially means that the distribution originates from the combination of 2 seperate distributions. This is also visible in the lineplot, where the first episodes are clearly different from the last episodes.

It is fun to see that the distribution of Words-Per-Episode fits these statistical distributions so well. The Gamma distribution succesfully models other problems such as:

  • waiting times at a busstop
  • the severity of insurance claims
  • the load on webservers

The Lognormal distribution succesfully models problems such as:

  • A country’s income distribution
  • The length of chess games
  • Particle size distributions in various contexts

So perhaps we can add to these lists:

  • the words-per-episode for the ‘Maarten van Rossem’ podcast

If we look at the raw data, the mean and the standard deviation are given by:

Show the code
print(f"Mean = {round(data_second_half['WPE'].mean(), 2)}")
print(f"Standard deviation = {round(data_second_half['WPE'].std(), 2)}")
Mean = 5428.66
Standard deviation = 1453.8

The best fit on this distribution for the Lognormal distributions gives:

Mean = 5439.38
Standard deviation = 1538.56

The best fit on this distribution for the Gamma distributions gives:

Mean = 5428.66
Standard deviation = 1458.21

With that out of the way, lets answer the question at hand: Are we getting less or more content each week?

3.1.2 The evolution of content over time

To answer our question we need to look at the content released over a set period of time, in this analysis we will look ‘per week’. By doing this we can account for both the length of individual episodes and the frequency of episodes.

Show the code
def plot_content_linear_fit(data):
    """
    Plot and show a figure of a linear fit to the amount of Content over Time grouped by Week.

    Parameters
    ----------
    data : pd.DataFrame
        Information about the episodes.

    Returns
    -------
    rmse_lineair_wpw: float
        The root mean square error of the linear fit.
    """
    START = data.iloc[0].date

    def weeks_since_start(date):
        """
        Calculate the number of weeks since START.

        START is defined outside the functions as the date of the first episode in the dataframe, typically episode 1.

        Parameters
        ----------
        date: pandas.timedelta
            The date for which to calculate the timedifference.

        Returns
        -------
        weeks_diff: int
            The number of weeks from START until date

        """
        time_diff = date - START
        weeks_diff = int(time_diff / np.timedelta64(1, "W"))
        return weeks_diff

    # Convert date to weeks since start
    data_plot = data.copy()
    data_plot = data_plot.sort_values("date").reset_index(drop=True)
    data_plot["weeks"] = data_plot.date.transform(lambda dt: weeks_since_start(dt))
    weeks = data_plot.weeks.unique()

    # Calculate weekly increase
    WPW = data_plot.groupby("weeks").WPE.sum()

    # Perform linear regression with intercept = 0
    weeks = np.array(weeks)
    a, b, r, p, se = linregress(weeks, WPW)
    rmse_lineair_wpw = mean_squared_error(WPW, weeks * a + b, squared=False)

    plt.figure(figsize=figsize_inch)
    plt.scatter(weeks, WPW)
    plt.plot(
        weeks,
        weeks * a + b,
        c="r",
        label="$y = ax + b$ \n"
        + f"a = {a:.2f} [words-per-week]\nb = {b:.2f} [words]\nRMSE = {rmse_lineair_wpw:.2f}\n$R^2$  = {r**2:.2f}",
    )
    plt.legend(loc="upper left")
    plt.xlabel("Weeks since start of podcast")
    plt.ylabel("Released content per week [words]")
    plt.ylim(0, 33000)
    plt.title("The amount of content per week is steadily increasing")
    return rmse_lineair_wpw


rmse_lineair_wpw = plot_content_linear_fit(data)

Figure 4: There is a clear rising trend in the weekly data, as illustrated by the linear fit. The trend indicates that the amount of weekly content has been increasing with on average 144 words per week. One might notice that we could get a better fit by ommiting the first datapoint: first 3 episodes were all released on the same day, followed by a 3 month gap untill episode 4. Removing this first week and starting at episode 4 results in a slightly steeper slope of around 150 words-per-week.

That’s great! We are getting more and more content every week. But, I’m not quite content with the linear trend. It is a decent fit, but if we take a closer look at the data, it doesn’t actually look like the rising trend is continuing after week 90, and it is not reasonable to expect the trend to keep rising given that the show appears to have settled into the new release schedule. Therefore, a logistic regression might be a better fit for this data:

Show the code
def plot_content_logistic_fit(data):
    """
    Plot and show a figure of a logistic fit to the amount of Content over Time grouped by Week.

    Parameters
    ----------
    data : pd.DataFrame
        Information about the episodes.

    Returns
    -------
    _: float
        The root mean square error of the logistic fit.
    """
    START = data.iloc[0].date

    def weeks_since_start(date):
        """
        Calculate the number of weeks since START.

        START is defined outside the functions as the date of the first episode in the dataframe, typically episode 1.

        Parameters
        ----------
        date: pandas.timedelta
            The date for which to calculate the timedifference.

        Returns
        -------
        weeks_diff: int
            The number of weeks from START until date

        """
        time_diff = date - START
        weeks_diff = int(time_diff / np.timedelta64(1, "W"))
        return weeks_diff
        return weeks_diff

    def logifunc(x, A, x0, k, off):
        """
        Returns the Y value of the specified logistic function for the given X.

        Parameters
        ----------
        x : np.array
            The X values for which to compute the logistic function

        A : float
            The Amplitude of the logistic function
        x0 : float
            The x-axis shift of the logistic curve, defines the midpoint of the step in the logistic curve
        k : float
            Defines how fast the logistic curve changes
        off : float
            The y-axis offset of the logistic curve.

        Returns
        -------
        _: float
            The y value of the logistic curve at x
        """
        return A / (1 + np.exp(-k * (x - x0))) + off

    def r_squared(y, y_pred):
        """
        Calculates R-squared metric for the given input.

        Parameters
        ----------
        y : np.array
            Observed y-values
        y_pred : np.array
            Predicted y-values

        Returns
        -------
        _: float
            R-squared metric
        """
        y, y_pred = np.array(y), np.array(y_pred)
        return 1 - np.sum((y - y_pred) ** 2) / np.sum((y - np.mean(y)) ** 2)

    # Convert date to weeks since start
    data_plot = data.copy()
    data_plot = data_plot.sort_values("date")
    data_plot["weeks"] = data_plot.date.transform(lambda dt: weeks_since_start(dt))
    weeks = data_plot.weeks.unique()

    # Calculate weekly increase
    WPW = data_plot.groupby("weeks").WPE.sum()

    # Fit logistic
    popt, pcov = curve_fit(logifunc, weeks, WPW, p0=[25000, 60, 0.1, 5000])
    rmse_logistic_wpw = mean_squared_error(WPW, logifunc(weeks, *popt), squared=False)
    r_logistic_wpw = r_squared(WPW, logifunc(weeks, *popt))

    # Perform linear regression with intercept = 0
    plt.figure(figsize=figsize_inch)
    plt.scatter(weeks, WPW)
    plt.plot(
        weeks,
        logifunc(weeks, *popt),
        "r-",
        label=f"Fitted Parameters {[round(p,1) for p in popt]}\nStarting-level={popt[3]:.1f}\nEnding-level ={popt[3]+popt[0]:.1f} \nRMSE={rmse_logistic_wpw:.2f}\n $R^2$ = {r_logistic_wpw:.2f}",
    )
    plt.legend(loc="upper left")
    plt.xlabel("Weeks since start of podcast")
    plt.ylabel("Released content per week [words]")
    plt.title(
        "The amount of content per week has almost tripled since the start of the podcast!"
    )
    plt.ylim(0, 33000)
    plt.show()
    return mean_squared_error(WPW, logifunc(weeks, *popt), squared=False)


rmse_logistic_wpw = plot_content_logistic_fit(data)

Figure 5: A Logistic-function fitted to the Words-per-week data. The lower RMSE and higher \(R^2\) indicate that this is a better fit than the linear-regression. It indicates that the initial release rate was around 8500 WPW, and it has increased to almost 22100 WPW.

Yes! This looks more reasonable. The content amount of content we are getting per week from Maarten and Tom has almost tripled since the podcast started.

So this podcast already has a lot of content, and we are getting a lot more every week. The total amount of content released is so far is 1989672 words. To listen to all this content takes 202 hours.

It’s not only a lot of fun that we have such an impressive amount of content, it is supposedly also very helpfull for a lot of people. A funny anecdote we hear a lot about this podcast is that it is great for people who suffer from insomnia, as it helps them fall asleep. There might be a few factors at play as to why this is:

  1. Maarten has a very low and calming voice.
  2. There are hardly any distracting sounds or loud noises.
  3. Maarten and Tom have calm conversations.
  4. Maarten and talk at a consistent rate.

I feel like everybody would agree on these 4 points, but with the data I collected, we can attempt to verify points 3 and 4 with our data-driven approach.

Table 1: Typical speech rate per content type (source: improvepodcast)
Content-type Words-per-Minute
Presentation Between 100 – 150 wpm for a comfortable pace
Conversational Between 120 – 150 wpm
Audiobooks Between 150 – 160 wpm (upper range that people comfortably hear & vocalize words)
Radio-shows & Podcasts Between 150 – 160 wpm
Auctioneers Can speak at about 250 wpm
Commentators Between 250- 400 wpm

Table 1 shows us the typical words-per-minute for several types of audio-content. I couldn’t find a better source than the one provided (This same table is used on multiple websites without any citations.). However, I could verify the Audibooks/Podcast rate: according to Guidelines for the Use of Multimedia in Instruction audiobooks are recommended to be at 150–160 WPM, as this is the upper-range within people comfortably hear and vocalize words, just as the table says.

So in order to very hypothesis 3 and 4, let’s continue our analysis!

4 ‘Uitslapen’ - Stay well rested like Maarten by listening to this Podcast

4.1 Do Maarten and Tom talk fast for a podcast?

Luckily for us, calculating the average speech rate is rather trivial. We can just devide the number of words in the episode by the duration. This gives us one value per episode, and doing this for all episodes once again gives us a nice statistical distribution:

Show the code
data["WPM"] = data["WPE"] / data["duration-m"]


def plot_wpm_histogram(data):
    """
    Plot histogram of Words-per-Minute distribution

    Parameters
    ----------
    data : pd.DataFrame
        Information about the episodes.

    Returns
    -------
    params: list
        Normal distribution fit parameters.
    """
    # Fit normal distribution
    params = norm.fit(data["WPM"])
    x = np.linspace(data["WPM"].min() - 10, data["WPM"].max() + 10, 100)
    norm_fitted = norm.pdf(x, *params)

    # Plot figure
    fig, ax = plt.subplots(figsize=figsize_inch)
    plt.title("Distribution of Words-per-Minute")
    ax.hist(data["WPM"], bins=15, density=True, edgecolor="#EAEAF2", linewidth=1)
    ax.plot(
        x,
        norm_fitted,
        label="Normal Distribution:\n"
        + r"  - $\mu$ = "
        + f"{round(params[0],2)}\n  - $\sigma$ = {round(params[1],2)}",
    )
    ax.set_xlabel("Words per minute (words/minute)")
    ax.set_ylabel("Probability Density")
    plt.xticks(rotation=70)
    plt.legend()
    plt.show()
    return params


params = plot_wpm_histogram(data)

Figure 6: The speech rate is nicely approximated by a normal distribution. The average speech rate per episode is 164 Words-per-Minute, just above the 150-160 WPM range recommended for podcasting. 95% of the episodes lie between the range 144-184 WPM.

Thats interesting! As shown in Figure 6, on average Maarten and Tom talk slightly faster than the talking rate recommended for full listener comprehension.

This result suprised me. I expected the speech rate to fall nicely within this range. I couldn’t find a source for dutch speaking, maybe the upper-range is dependent on the language? I did some more searching and came across this interesting publication A comparative analysis of speech rate and perception in radio bulletins which states that the averge conversational speech rate for English is between 150-190 WPM, and the average speech rate for BBC radio is 167 WPM. Meanwhile, the speech rate for Radio Nacional de España (RNE) was 210 WPM. So the podcast speech rate is slightly slower than the BBC, which I would also typically characterize as a calm radio station. Also, it would be good to note that audiobooks also tend to be a lot calmer than regular conversations, so having a speech rate slightly faster than recommended for audibooks is probably still very calm.

In order to have some sense of a Dutch reference, I also processed the most popular Dutch podcast episode today as listed by Spotify: “Geuze & Gorgels - season 2 episode 47 - Pretty Hurts”. This episode has a speech rate of 207 WPM. As this single episode has a higher rate than all processed episodes for the ‘Maarten van Rossem - De Podcast’ podcast, I does give me confidence that Maarten and Tom really have a calm speech rate.

Let’s move on to our next hypothesis: ‘Maarten and Tom talk at a consistent rate.’, to see if we can elucidate this subject some more.

4.2 Maarten and Tom keep their talking rate very consistent throughout the episode

This talking rate hypothesis is a bit more difficult to answer, but it is certainly possible. Luckily for us Whisper also creates subtitle files for each processed episode (.srt, .vtt). We can process these to devide the text of each episode into minutes, so we can estimate the speech rate per minute. By doing this, we can estimate the speech rate distribution per episode, and plot this result as ranges per episode:

Show the code
def parse_srt(row):
    """
    Parse an .srt file into a dataframe with timestamps per line.

    Parameters
    ----------
    row : pd.Series
        entrie in data dataframe with episode information

    Returns
    -------
    srt: pd.DataFrame
        DataFrame with parsed .srt data
    """
    path = row.txt_path.replace("txt", "srt")
    srt = read_txt_file(path).split("\n")

    # The srt has a standard formatting:
    # 1. Line number
    # 2. Content
    # 3. Timestamp
    # Followed by a blank line
    lines, timestamps, sentences = [], [], []
    i = 0
    while i < len(srt) - 1:
        lines.append(srt[i])
        timestamps.append(srt[i + 1])
        sentences.append(srt[i + 2])
        i += 4

    # Get length of sentence
    srt = pd.DataFrame(
        {"lines": lines, "sentences": sentences, "timestamps": timestamps}
    )
    temp = srt["timestamps"].str.split("-->", n=1, expand=True)
    srt["time_start"] = temp[0]
    srt["time_start"] = srt["time_start"].str.replace(",", ".")
    srt["time_end"] = temp[1]
    srt["time_end"] = srt["time_end"].str.replace(",", ".")
    srt["time_start"] = pd.to_timedelta(srt.time_start)
    srt = srt.drop(columns="timestamps")
    srt["time_end"] = pd.to_timedelta(srt.time_end)
    srt["duration"] = pd.to_timedelta(
        srt["time_end"] - srt["time_start"]
    ).dt.total_seconds()

    # Get cadence of episode
    srt["length"] = srt["sentences"].transform(lambda text: get_length(text))

    # Aggregate per minute
    srt["minute"] = (srt.time_end.dt.total_seconds() // 60).astype("int")
    srt = srt.groupby("minute").agg(
        {"sentences": " ".join, "duration": "sum", "length": "sum"}
    )
    srt["WPM_line"] = srt["length"] / srt["duration"] * 60
    srt = srt.reset_index()
    srt["episode"] = path
    srt["date"] = row.date
    srt["titles"] = row.titles

    # We drop the last minute as it contains the outro and adds.
    # We also drop the first minute, as it contains the intro
    srt = srt[1:-1]
    # In a few files, Whisper had trouble picking up the audio.
    # Only transcribing 1 line for more than a minute.
    # To filter these bad lines out, we remove any minute with less than 90 words.and
    # Also, in some episodes they listen to historic speeches, which are quite slow.
    # We filter these 'bad'-lines out by setting a lower limit of 100 WPM
    # This is not a problem, as it is far below even the lower bound of the speech rate.
    srt = srt[srt.WPM_line >= 100]
    return srt


def plot_srts_wpm(srts):
    """
    Plot wpm distribution over time, using kernel density estimators.

    Parameters
    ----------
    srts : list(pd.DataFrames)
        A parsed .srt DataFrame per episode

    Returns
    -------
    ci_90: np.array
        90% confidence interval per episode (not HPDI).
    hpd: np.array
        WPM with highest probability density per episode.
    """
    ci_60 = []
    ci_90 = []
    hpd = []
    date = []
    for df in srts:
        # Calculate the data confidence interval
        kde = KDEUnivariate(df.WPM_line)
        kde.fit(bw=5)
        icdf = kde.icdf
        confidence_interval = (np.percentile(icdf, 20), np.percentile(icdf, 80))
        ci_60.append(confidence_interval)
        confidence_interval = (np.percentile(icdf, 5), np.percentile(icdf, 95))
        ci_90.append(confidence_interval)
        hpd.append(kde.support[np.argmax(kde.density)])
        date.append(df.date[1])
    ci_60 = np.array(ci_60)
    ci_90 = np.array(ci_90)

    fig, ax = plt.subplots(figsize=figsize_inch)
    plt.plot(date, hpd, alpha=0.5, color="k", label="Highest Probability Density WPM")
    plt.fill_between(
        date,
        ci_90[:, 0],
        ci_90[:, 1],
        color="#1f77b4",
        linewidth=0,
        alpha=0.3,
        label=r"90% interval WPM",
    )
    plt.fill_between(
        date,
        ci_60[:, 0],
        ci_60[:, 1],
        color="#1f77b4",
        linewidth=0,
        alpha=0.5,
        label=r"60% interval WPM",
    )

    plt.xlabel("Episode #")
    plt.ylabel("Words-per-Minute")
    plt.title("Confidence Interval of WPM_lines")
    plt.legend()
    plt.xticks(rotation=70)
    ax.xaxis.set_major_locator(mdates.MonthLocator())
    ax.xaxis.set_major_formatter(mdates.DateFormatter("%Y-%b"))
    plt.show()
    return ci_90, hpd


srts = []
for _, row in data.iterrows():
    srt = parse_srt(row)
    srts.append(srt)
ci_90, hpd = plot_srts_wpm(srts)

Figure 7: Using the .srt (subtitle) files generated by Whisper, we are able to analyse the spread of the WPM per minute. For symmetric distributions the Highest Probability Density is the same as the mean, but for skewed distributions such as the lognormal, this value tends to be smaller than the mean and is a bit more representative for the most likely value. We can see that the episodes remain between 140-200 WPM for the most part.

It is fun to see that Figure 2 and Figure 7 show a similair change in episode structure. The earlier episodes had a speech rate almost 20 wpm faster than more recent episodes. Other than that, we can see that episodes stay within the range of 150-180 WPM, with a very small percentage going above 200 wpm. #TODO

Show the code
def plot_srts_wpm_weekly(srts):
    """
    Plot wpm distribution over per weekday, ing kernel density estimators.

    Parameters
    ----------
    srts : list(pd.DataFrames)
        A parsed .srt DataFrame per episode

    Returns
    -------
    ci_90: np.array
        90% confidence interval per weekday (not HPDI).
    hpd: np.array
        WPM with highest probability density per weekday.
    """

    # plot per day of week
    df_weekday = pd.concat(srts)
    df_weekday["weekday"] = df_weekday.date.transform(lambda x: x.weekday())

    ci_60 = []
    ci_90 = []
    hpd = []
    weekdays = []
    number_to_week = {
        1: "Monday",
        2: "Tuesday",
        3: "Wednesday",
        4: "Thursday",
        5: "Friday",
        6: "Saturday",
        7: "Sunday",
    }
    for i in range(7):
        weekday = number_to_week[i + 1]
        df = df_weekday[df_weekday.weekday == i]
        # Calculate the data confidence interval
        kde = KDEUnivariate(df.WPM_line)
        kde.fit(bw=6)
        icdf = kde.icdf
        confidence_interval = (np.percentile(icdf, 20), np.percentile(icdf, 80))
        ci_60.append(confidence_interval)
        confidence_interval = (np.percentile(icdf, 5), np.percentile(icdf, 95))
        ci_90.append(confidence_interval)
        hpd.append(kde.support[np.argmax(kde.density)])
        weekdays.append(weekday)

    ci_60 = np.array(ci_60)
    ci_90 = np.array(ci_90)

    # Set horizontal labels
    labels = df_weekday.groupby("weekday").agg(
        {"weekday": lambda x: x.iloc[0], "episode": pd.Series.nunique}
    )
    labels["label"] = labels.agg(
        lambda row: f"{number_to_week[row.weekday+1]}\n{row.episode} episodes", axis=1
    )

    fig, ax = plt.subplots(figsize=figsize_inch)
    plt.plot(
        weekdays, hpd, alpha=0.5, color="k", label="Highest Probability Density WPM"
    )
    plt.fill_between(
        weekdays,
        ci_90[:, 0],
        ci_90[:, 1],
        color="#1f77b4",
        linewidth=0,
        alpha=0.3,
        label=r"90% interval WPM",
    )
    plt.fill_between(
        weekdays,
        ci_60[:, 0],
        ci_60[:, 1],
        color="#1f77b4",
        linewidth=0,
        alpha=0.5,
        label=r"60% interval WPM",
    )
    plt.xlabel("Weekday")
    plt.ylabel("Words-per-Minute")
    plt.title("Confidence Interval of WPM_lines")
    plt.legend()
    plt.gca().set_xticklabels(labels.label)
    # plt.xticks(rotation = 70)
    # ax.xaxis.set_major_locator(mdates.MonthLocator())
    # ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%b'))
    plt.show()
    return ci_90, hpd


# Again, we only select the second half of the show
srts_second_half = [
    srt for second, srt in zip((data["date"] > "2021-08-1"), srts) if second
]
ci_90, hpd = plot_srts_wpm_weekly(srts_second_half)

Figure 8: Grouping these episodes by the respective day of the week, we can see a pattern emerge. Tuesday episodes tend to be the slowest, while Monday and Saturday episodes tend to be the fastest. Wednesday episodes have the smallest spread thus appear to be the most consistent, while also being fairly slow. Thus Tuesday and Wednesday episodes are perhaps the best choice for those trying to sleep.

In Figure 8 a cool weekly pattern emerges. On Tuesday and Wednesday episodes are the slowest, while saturday episodes are clearly the fastest. Also, in general the spread shown in Figure 8 in Figure 7 appears to be fairly narrow. 60% of the episodes stays within a 30 WPM band, and hardly ever do they go above 200 WPM.

While part of me would like a more robust comparisson with some other data, I think we’ve gone far enough on this topic. If you have trouble sleeping, the data seems to agree that listening to this podcast might be an excellent choice. If you are interested in a curated playlist of the ‘slowest’ episodes, click on the cell below!

titles date duration episode WPM
#196 - Johan Derksen 2022-05-11 00:33:55 196 136.245700
#183 - Thorbecke 2022-04-26 00:31:46 183 139.391396
#320 - Vichy-regime 2022-12-04 00:33:42 320 139.910979
#101 - Vietnamoorlog 2021-12-03 00:29:57 101 140.267112
#144 - Poetin vs Mussolini 2022-03-08 00:40:24 144 142.326733
#221 - Zo win je de oorlog 2022-06-15 00:27:48 221 142.733813
#204 - Hoe Poetin radicaliseerde 2022-05-23 00:31:12 204 143.878205
#269 - Tragische ondergang 2022-09-06 00:36:04 269 144.482440
#237 - Noord- en Zuid-Korea 🇰🇷 2022-07-15 00:25:42 237 145.058366
#198 - Wat ging er mis in Oekraïne? 2022-05-15 00:31:09 198 145.425361
#125 - Kernwapen 2022-02-03 00:50:55 125 145.512275
#54 - Hitler 2021-08-04 00:48:50 54 146.662116
#227 - Battle of Britain 2022-06-24 00:33:58 227 147.674190
#186 - Elon Musk 2022-04-29 00:13:23 186 148.019925
#278 - Operatie Market Garden 2022-09-22 00:42:48 278 148.084112
#306 - Tank in de oorlog 2022-11-10 00:34:29 306 148.332528
#167 - Held 2022-04-05 00:42:22 167 148.843430
#162 - Churchill 2022-03-30 00:38:09 162 148.885976
#314 - Invasie van Taiwan 2022-11-24 00:48:39 314 148.900308
#261 - Blunders 2022-08-23 00:25:25 261 149.036066
#281 - Toekomst voorspellen 2022-09-27 00:39:46 281 149.497066
#293 - Cubacrisis 2022-10-18 00:35:32 293 149.943715
#222 - Einde aan globalisering? 2022-06-16 00:38:10 222 150.078603
#174 - Inloggen, uitloggen 2022-04-13 00:30:22 174 150.164654
#255 - Herverkiezing Trump 2022-08-14 00:26:05 255 150.249201

It’s time to delve deeper into our data. Let’s make use of all the text-data we’ve collected!

5 ‘Nou natuurlijk beste mensen!’ - are of course some of the favourite words of Maarten

Maarten has a typical way of speaking, you don’t need any data to know this. Especially when he gets excited. As we have almost 200 hours of Maarten Talking, we can figure out what his most commonly used words are!

Show the code
full_text = " ".join(data["text"]).lower()
path_wordcloud_full = "./cache/wordcloud_full.pickle"

if not os.path.exists(path_wordcloud_full):
    # Generate a word cloud image
    wordcloud_full = WordCloud(
        width=figsize[0],
        height=figsize[1],
        include_numbers=True,
        random_state=random_seed,
        background_color="white",
        relative_scaling=1,
        max_words=300,
    ).generate(full_text)
    write_pickle(path_wordcloud_full, wordcloud_full)
else:
    wordcloud_full = read_pickle(path_wordcloud_full)

# Display the generated image:
# the matplotlib way:
plt.figure(figsize=figsize_inch)
plt.imshow(wordcloud_full, interpolation="bilinear")
plt.axis("off")
plt.tight_layout()
plt.show()

Figure 9: A wordcloud of the most common words in the podcast. The size of a word indicates the relative frequency. Since we didn’t filter for stopwords, the wordcloud is filled with uninteresting words that are not specific for Maarten.

Right.. this is not what we wanted. It is logical that these words appear a lot, but they don’t have any interesting meaning. We need to filter out these words, called stopwords, to get a more interesting result.

Show the code
# Create stopword list:
stopwords_path = "../dependencies/dutch_stopwords.txt"
with open(stopwords_path, "r") as f:
    dutch_stopwords = f.read().split("\n")
dutch_stopwords = set(dutch_stopwords)

# Create improved wordcloud
path_wordcloud_stopwords = "./cache/wordcloud_stopwords.pickle"
if not os.path.exists(path_wordcloud_stopwords):
    wordcloud_stopwords = WordCloud(
        stopwords=dutch_stopwords,
        width=figsize[0],
        height=figsize[1],
        include_numbers=True,
        random_state=random_seed,
        background_color="white",
        relative_scaling=1,
        max_words=300,
    ).generate(full_text)
    write_pickle(path_wordcloud_stopwords, wordcloud_stopwords)
else:
    wordcloud_stopwords = read_pickle(path_wordcloud_stopwords)
# Display the generated image:
# the matplotlib way:
plt.figure(figsize=figsize_inch)
plt.imshow(wordcloud_stopwords, interpolation="bilinear")
plt.axis("off")
plt.tight_layout()
plt.show()

Figure 10: A wordcloud of the most common words in the podcast. The size of a word indicates the relative frequency. We can see common words appear, which also indicate various topics Maarten and Tom talk about: Ukraine, politics, Trump, history. Take a look and see what you can spot and recognize!

That’s more like it! It appears that Maarten uses the word ‘Natuurlijk’ a lot. Also, I can recognize the use of ‘Mensen’, ‘Allemaal’, and ‘Helemaal’ from some of the typical Maarten rants when he gets annoyed by something. There are also all kinds of topics hidden in the wordcloud. Take a look for yourself!

5.1 Table of most common words

While figures are always fine, it’s also nice to look at the raw-data itself.

Show the code
def get_top_n_words(data, ngram_range=(1,3), minimum_rate=1, stopwords=dutch_stopwords):
    """
    List all words in the corpus that are used on average >= 1 time per episode.

    Parameters
    ----------
    data : pd.DataFrame
        Information about the episodes.

    Returns
    -------
    word_freq : pd.DataFrame
        Table of word frequencies.
    bag_of_words : pd.DataFrame
        Table containing the word frequencies per episode.
    vec : sklearn.CountVectorizer
        CountVectorizer fitted to the corpus.
    """
    vec = CountVectorizer(ngram_range=ngram_range, stop_words=dutch_stopwords).fit(
        data["text"]
    )
    bag_of_words = vec.transform(data["text"])
    sum_words = bag_of_words.sum(axis=0)
    word_freq = [(word, sum_words[0, idx]) for word, idx in vec.vocabulary_.items()]
    word_freq = sorted(word_freq, key=lambda x: x[1], reverse=True)
    word_freq = pd.DataFrame(word_freq, columns=("Token", "Count"))
    word_freq["Rate_per_Episode"] = round(word_freq["Count"] / data.shape[0], 2)
    word_freq = word_freq[word_freq["Rate_per_Episode"] >= minimum_rate]
    return word_freq, bag_of_words, vec


path_top_n_words = "./cache/top_n_words.pickle"
if not os.path.exists(path_top_n_words):
    word_freq, bag_of_words, vectorizer = get_top_n_words(data)
    package = [word_freq, bag_of_words, vectorizer]
    write_pickle(path_top_n_words, package)
else:
    package = read_pickle(path_top_n_words)
    word_freq, bag_of_words, vectorizer = package
pd.set_option("display.max_rows", word_freq.shape[0] + 1)
word_freq.iloc[:21].to_html(index=False)
Token Count Rate_per_Episode
natuurlijk 10691 32.50
nou 8631 26.23
zeggen 6567 19.96
weet 5298 16.10
mensen 4990 15.17
goed 4749 14.43
hele 4435 13.48
gaan 3880 11.79
allemaal 3866 11.75
denk 3861 11.74
helemaal 3334 10.13
gaat 3294 10.01
jaar 2560 7.78
zit 2441 7.42
nederland 2393 7.27
soort 2292 6.97
echt 2261 6.87
laten 2211 6.72
komt 2157 6.56
vind 2137 6.50
mee 2115 6.43

We knew ‘Natuurlijk’ was used a lot, but 32 times per episode, wow! I’ve collected all words used more than once per episode in the table below.

Token Count Rate_per_Episode
natuurlijk 10691 32.50
nou 8631 26.23
zeggen 6567 19.96
weet 5298 16.10
mensen 4990 15.17
goed 4749 14.43
hele 4435 13.48
gaan 3880 11.79
allemaal 3866 11.75
denk 3861 11.74
helemaal 3334 10.13
gaat 3294 10.01
jaar 2560 7.78
zit 2441 7.42
nederland 2393 7.27
soort 2292 6.97
echt 2261 6.87
laten 2211 6.72
komt 2157 6.56
vind 2137 6.50
mee 2115 6.43
gezegd 2072 6.30
zegt 2013 6.12
idee 1930 5.87
grote 1906 5.79
staat 1826 5.55
keer 1761 5.35
dingen 1757 5.34
gedaan 1751 5.32
auto 1742 5.29
kijk 1734 5.27
zitten 1672 5.08
allerlei 1632 4.96
jaren 1626 4.94
kijken 1617 4.91
komen 1583 4.81
tijd 1552 4.72
zien 1540 4.68
weten 1514 4.60
vond 1410 4.29
leuk 1404 4.27
geval 1396 4.24
enorm 1388 4.22
ga 1387 4.22
feite 1375 4.18
geloof 1375 4.18
groot 1312 3.99
oké 1298 3.95
vraag 1294 3.93
één 1262 3.84
zie 1258 3.82
lang 1247 3.79
dacht 1240 3.77
amerika 1221 3.71
laat 1198 3.64
duitsland 1178 3.58
denken 1169 3.55
elkaar 1169 3.55
man 1167 3.55
denkt 1144 3.48
ziet 1139 3.46
probleem 1131 3.44
land 1122 3.41
bijvoorbeeld 1110 3.37
gemaakt 1108 3.37
geworden 1104 3.36
gezien 1104 3.36
wereld 1090 3.31
beter 1085 3.30
moment 1082 3.29
maarten 1081 3.29
staan 1076 3.27
nieuwe 1038 3.16
ging 990 3.01
rutte 986 3.00
podcast 954 2.90
ten 951 2.89
totaal 947 2.88
heet 912 2.77
oorlog 907 2.76
zin 899 2.73
leven 896 2.72
staten 891 2.71
terug 867 2.64
vinden 863 2.62
zeg 849 2.58
844 2.57
zaak 837 2.54
partij 833 2.53
rusland 831 2.53
china 830 2.52
interessant 829 2.52
europa 828 2.52
enorme 822 2.50
feit 818 2.49
ding 815 2.48
kwam 812 2.47
punt 808 2.46
best 804 2.44
krijgen 800 2.43
mogelijk 780 2.37
oekraïne 780 2.37
nederlandse 777 2.36
overheid 774 2.35
dag 773 2.35
zat 760 2.31
oh 759 2.31
trump 754 2.29
politiek 742 2.26
opzichten 741 2.25
houden 728 2.21
snel 724 2.20
wereldoorlog 719 2.19
duitsers 717 2.18
boek 712 2.16
verenigde 704 2.14
week 703 2.14
verenigde staten 692 2.10
geld 687 2.09
gek 679 2.06
amerikaanse 675 2.05
deel 668 2.03
landen 663 2.02
waarbij 652 1.98
amerikanen 650 1.98
vragen 646 1.96
verschrikkelijk 646 1.96
poetin 642 1.95
duidelijk 632 1.92
uur 632 1.92
begrijp 630 1.91
horen 628 1.91
zoveel 623 1.89
indruk 622 1.89
principe 620 1.88
hitler 620 1.88
graag 619 1.88
president 617 1.88
kabinet 615 1.87
goede 614 1.87
lezen 612 1.86
russen 604 1.84
uiteindelijk 593 1.80
aantal 593 1.80
trouwens 585 1.78
zag 579 1.76
tegenwoordig 578 1.76
gebeuren 577 1.75
rijden 575 1.75
duitse 574 1.74
verhaal 572 1.74
klein 570 1.73
ligt 565 1.72
geschiedenis 565 1.72
manier 563 1.71
nodig 561 1.71
nogmaals 561 1.71
ontzettend 559 1.70
vindt 557 1.69
meneer 556 1.69
begreep 554 1.68
programma 554 1.68
zeer 552 1.68
stuk 551 1.67
huis 551 1.67
eerlijk 548 1.67
gekomen 547 1.66
geven 537 1.63
hoor 535 1.63
minister 533 1.62
sowieso 532 1.62
hartstikke 532 1.62
prima 530 1.61
eeuw 530 1.61
kant 529 1.61
allerlei opzichten 529 1.61
werk 528 1.60
begin 528 1.60
systeem 528 1.60
laten zeggen 526 1.60
jonge 525 1.60
rol 523 1.59
leuke 523 1.59
europese 522 1.59
stond 521 1.58
bleek 519 1.58
kinderen 516 1.57
lekker 514 1.56
fijn 513 1.56
hoop 512 1.56
meteen 511 1.55
bezig 508 1.54
beste 508 1.54
laatste 505 1.53
wist 501 1.52
zetten 500 1.52
blijven 497 1.51
lopen 497 1.51
volgende 496 1.51
begonnen 493 1.50
vrouw 490 1.49
krijgt 487 1.48
grootste 486 1.48
miljoen 483 1.47
enzovoort 482 1.47
kleine 480 1.46
zoiets 480 1.46
begrijpt 479 1.46
politieke 479 1.46
kom 479 1.46
problemen 478 1.45
gelezen 472 1.43
geweldig 466 1.42
kennelijk 460 1.40
spreken 457 1.39
zaken 456 1.39
beginnen 455 1.38
slotte 453 1.38
blijkt 449 1.36
utrecht 447 1.36
bekende 444 1.35
volledig 444 1.35
valt 442 1.34
wijze 438 1.33
hand 438 1.33
gegaan 436 1.33
tenslotte 436 1.33
gebeurd 436 1.33
gegeven 435 1.32
rossum 433 1.32
erbij 430 1.31
dood 430 1.31
verkiezingen 429 1.30
media 429 1.30
wilde 429 1.30
vergeten 428 1.30
krijg 428 1.30
unie 424 1.29
blijft 421 1.28
russische 421 1.28
ten slotte 420 1.28
werkt 418 1.27
eerlijk gezegd 416 1.26
begint 415 1.26
slecht 414 1.26
vvd 414 1.26
tv 414 1.26
noemen 412 1.25
frankrijk 412 1.25
mooi 411 1.25
begrepen 410 1.25
relatief 407 1.24
termijn 406 1.23
oude 406 1.23
daarvan 405 1.23
voorstellen 404 1.23
vertellen 403 1.22
betreft 401 1.22
gebeurt 400 1.22
oud 400 1.22
kans 399 1.21
enkele 396 1.20
gekregen 394 1.20
betekent 394 1.20
water 393 1.19
volkomen 393 1.19
gebruikt 390 1.19
ter 387 1.18
bevolking 386 1.17
kamer 384 1.17
beleid 383 1.16
stad 383 1.16
werken 382 1.16
eind 382 1.16
waarvan 379 1.15
engeland 379 1.15
kijkt 377 1.15
procent 376 1.14
waardoor 375 1.14
gehoord 372 1.13
normaal 372 1.13
daarvoor 369 1.12
heen 366 1.11
lange 365 1.11
druk 364 1.11
gezet 364 1.11
thuis 363 1.10
sorry 363 1.10
klopt 363 1.10
terecht 360 1.09
woord 356 1.08
wonderlijke 356 1.08
althans 356 1.08
name 356 1.08
stemmen 354 1.08
loopt 354 1.08
000 354 1.08
verloren 353 1.07
schijnt 352 1.07
weken 350 1.06
democratie 349 1.06
verstandig 349 1.06
daarmee 344 1.05
economie 343 1.04
betrekkelijk 343 1.04
reden 342 1.04
vroeger 341 1.04
macht 341 1.04
eventjes 340 1.03
dagen 340 1.03
hoort 340 1.03
meeste 339 1.03
interessante 337 1.02
partijen 337 1.02
leger 337 1.02
50 335 1.02
half 334 1.02
luisteren 334 1.02
geschreven 333 1.01
geeft 333 1.01
lees 333 1.01
gedacht 331 1.01
rare 331 1.01
20 330 1.00
krant 329 1.00
belangrijk 328 1.00
bedoel 328 1.00

As we noted above, some interesting topics arose. I wonder, would it be possible to track some interesting topics over time? For example, I can’t image Maarten and Tom talked a lot about Ukraine before the war, so we should be able to pick this up in the data.

Let’s attempt to track the use of “oekraïne” across episodes:

Show the code
def plot_word_over_time(target_word):
    """
    Plot the frequency of the target word over time.

    Parameters
    ----------
    target_word : str
        Word of interest.
    """
    id = [idx for word, idx in vectorizer.vocabulary_.items() if word == target_word][0]
    dist = bag_of_words[:, id].toarray().T[0]

    fig, ax = plt.subplots(figsize=figsize_inch)
    plt.plot(data["date"], dist)
    plt.title(f"Mentions of the word: {target_word}")
    plt.ylabel("Counts")
    plt.xlabel("Date")

    # set x-axis
    ax.xaxis.set_major_locator(mdates.MonthLocator())
    ax.xaxis.set_major_formatter(mdates.DateFormatter("%Y-%b"))
    plt.xticks(rotation=70)
    plt.show()


target_word = "oekraïne"
plot_word_over_time(target_word)

Figure 11: In this figure we can clearly see the interest in the topic of the Ukraine take off in januari 2022. This demonstrates that we can track topics over time in the podcast.

Figure 11 demonstrates that we can indeed track topics over time. Let us try this for another topic:

Show the code
plot_word_over_time("ggd")

Figure 12: While less extreme than Figure 11, we can clearly see our key event in the data.

As some of you may Remember, Maarten had a small run-in with the GGD and Hugo de Jonge were it was later revealed that Maarten was fully justified in his actions. As far as I know he never received an apalogy from Hugo… Anyways, this hole stint happened roughly halfway March 2021, and in Figure 12 we see a big spike in the mentions of the GGD.

So, we’ve demonstrated we can track news-worthy topics over time by mining our podcast. Can we go deeper? Yes, quite a bit in fact! In the next section we’ll use some clever technique’s to find out what this podcast is actually about.

6 ‘Kunt u mij horen?’ - What is ‘Maarten van Rossem - De Podcast’ actually about?

Within the field of machine learning, there is the field of ‘topic modeling’. Topic modeling tries to automatically extract abstract the abstract concept of topics from a collection of documents, and then asigns one or more topics to each document. So given a selection of documents, such as transcribed podcast episodes, we can use these unsupervised machine learning techniques to extract common topics from the various episodes.

This part of the analysis was largely inspired by the wonderful work of Maarten Grootendorst and uses his BERTopic topic modeling pipeline. In short, the BERTopic algorithm works as follows:

  1. Sentence transformer (Deep Neural Network - Transformer architecture):
    We encode our documents into a 728 dimensional latent space that is able to capture the semantical and contextual meaning of text. Transformers are the type of neural networks that are responsible for the rapid development in Natural Language Processing in the last 8 years.
  2. Dimensionality reduction algorithm (UMAP):  High dimensional spaces such as the above are difficult to cluster due to the curse of dimensionality. We use a dimensionality reduction algorithm to reduce the number of dimensions to ~7. This algorithm tries to strike a balance between preserving local and global structure of the data. Such extreme dimensionality reduction means that we will lose information, but in exchange makes the data a lot more tractable for the clustering algorithm.
  3. Clustering algorithm (HDBSCAN):
    This hiërarchical clustering algorithm takes the output of UMAP and calculates the distances between points using a metric that takes into account the density of the region the points are in. The algorithm then tries to select the most stable clusters. Thus, the documents are gathered into semantically similair clusters which represent what we will call topics.
  4. Vectorizer C-TF-IDF:
    Our documents are split into words (tokens) using a vectorizer. Then we apply a modified version of Term Frequency-Inverse Document Frequency to create human interpretable labels for the various topics. Words that appear often in a particular topic, but very little in other topics are most likely to be selected to represent a topic.

So we can use this pipeline to transform our documents into embeddings, which are essentially vectors which are able to capture the semantic meaning of our documents, and apply a clustering algorithm to those to find our topic per document. In this case a document is how we split our data, for example per episode. Getting a topic per episode is nice, but if there is one thing I know about this podcast, it is that it can wildly swing off topic at any moment. So instead of getting a topic per sentence, it would be more interesting to get a topic per episode. And since we already wrote some code to chop the .srt files into minutes, this is actualy quite easy to do! The relatively short chunk of code below performs all the steps for extracting our topics.

Show the code
# Sentencize the transcripts and track their titles
docs = []
titles = []
timestamps = []
for srt in srts:
    for text_minute in srt["sentences"]:
        docs.append(text_minute)
        titles.append(srt.titles.iloc[1])
        timestamps.append(srt.date.iloc[1])

# Create sentence embeddings for BERTopic
embeddings_path = "./cache/embeddings.npy"
if not os.path.exists(embeddings_path):
    # Create embeddings from the documents
    sentence_model = SentenceTransformer("paraphrase-multilingual-mpnet-base-v2")
    embeddings = sentence_model.encode(docs)
    np.save(embeddings_path, embeddings)
else:
    embeddings = np.load(embeddings_path)

# Train and save our BERTopic model, load from cache if save file is found
model_path = "./cache/BERTopic_topic_model.pickle"
if not os.path.exists(model_path):
    # Reset random seeds
    random.seed(random_seed)
    np.random.seed(random_seed)

    # Define sub-models
    sentence_model = SentenceTransformer("paraphrase-multilingual-mpnet-base-v2")
    vectorizer = CountVectorizer(stop_words=dutch_stopwords)
    n_neighbors = 15
    umap_model = UMAP(
        n_neighbors=n_neighbors,  # Higher -> More global structure, less local
        n_components=4,  # Effects clustering mostly, advice is to leave around ~5
        min_dist=0.0,
        metric="cosine",
        random_state=random_seed,
    )

    hdbscan_model = HDBSCAN(
        min_cluster_size=20,  # Higher -> less clusters, bigger size
        min_samples=4,  # Lower -> less outlier classifications, may be detrimental to quality topics.
        metric="euclidean",
        cluster_selection_method="eom",
    )

    # Train our topic model
    topic_model = BERTopic(
        n_gram_range=(1),
        embedding_model=sentence_model,
        umap_model=umap_model,
        hdbscan_model=hdbscan_model,
        vectorizer_model=vectorizer,
    )

    topic_model = topic_model.fit(docs, embeddings)

    # Save model
    topic_model.save(model_path)
else:
    topic_model = BERTopic().load(model_path)

6.1 What topics does the model find?

Our model has tried to assigned each minute of the podcast, to a topic, excluding the first and last minute of each episode. The top 10 most assigned topics are shown in the table below. The name of the topic is formed by selecting the top 4 words that appear a lot in the ontopic documents and very little in the offtopic documents:

Show the code
topics = topic_model.get_topic_info()
print(len(topics))
topics[1:11].to_html(index=False)
99
Topic Count Name
0 630 0_oekraïne_rusland_poetin_russen
1 383 1_china_taiwan_chinezen_xi
2 374 2_vvd_partij_cda_kabinet
3 336 3_trump_republikeinen_biden_president
4 270 4_hitler_duitsers_wereldoorlog_duitsland
5 245 5_auto_ford_motor_porsche
6 194 6_onderwijs_school_geschiedenis_middelbare
7 190 7_gevaccineerd_vaccineren_vaccin_vaccinatie
8 154 8_stad_utrecht_amsterdam_nederland
9 153 9_boek_lezen_boeken_duck

Amazing! We can see that the model was able to find clearly interpretable topics, and they make a lot of sense. Maarten and Tom have talked a lot about the Ukraine and Russia, as well as Dutch politics, the polics of the USA, Covid-19, the Netherlands. I’m realy impressed with how well this works.

How do you quantify what should be a topic?

I’m very happy with the results of this algorithm. The topics found are very recognisable for the podcast and make sense. However, the distribution (counts) of the topics should be taken with a grain of salt.

Above I described the building blocks of our algorithm, and they all have a list of parameters to set:

  • Sentence transformer:
    One needs to choose which pre-trained model to use, or trains a model themselves. Each model will generate different embeddings for our documents.
  • Dimensionality reduction algorithm (UMAP): 
    • n_neighbors: How many neighbours should be considered for the distance-density metric.
    • n_components: How many dimensions should the output be.
    • min_dist: How close are datapoints allowed to be to one another in the output embedding.
    • metric: Which distance metric is used.
    • random_state: Umap is a stochastic algorithm, training it twice with the same settings will give slightly different results.
  • Clustering algorithm (HDBSCAN):
    • min_cluster_size: How many documents should a cluster have at the minimum.
    • min_samples: How conservative should the clustering algorithm be.
    • metric: Which distance metric to use for clustering.

There are more parameters, but these are the main parameters to tune for our algorithm. Setting these can feel somewhat arbitrary. Changing just one of these parameters can have a big effect on the resulting clusters, and how to decide which parameter settings are better is not apparently obvious. With the settings used for this analysis “oekraïne_rusland_poetin_russen” is the most occuring topic. With different settings this topic was split into multiple topics: one for Poetin, one for the Nato, one for Crimea, etc. Splitting into these subcategories also means that none of these components is in the top 10 of detected topics. The reverse is also true, with the current settings some topics were split into sub-topics which would otherwise have a significantly higher count. In the end it is a personal preference which is better when it comes to such an abstract subject as what is part of a topic and what is not. I’m sure there are quantitative ways to explore this topic and to select which parameter setting leads to an optimal detection and allocation of topics, but that is outside of the scope of this project.

The first topic -1 collects all documents, or in our case minutes, that could not be assigned to any particular topic. As you will see later in the visualization, these still cluster nicely around known topics, and using this their topic can often still be infered.

Show the code
topics = topic_model.get_topic_info()
topics.to_html(index=False)
Topic Count Name
-1 4689 -1_nou_natuurlijk_weet_zeggen
0 630 0_oekraïne_rusland_poetin_russen
1 383 1_china_taiwan_chinezen_xi
2 374 2_vvd_partij_cda_kabinet
3 336 3_trump_republikeinen_biden_president
4 270 4_hitler_duitsers_wereldoorlog_duitsland
5 245 5_auto_ford_motor_porsche
6 194 6_onderwijs_school_geschiedenis_middelbare
7 190 7_gevaccineerd_vaccineren_vaccin_vaccinatie
8 154 8_stad_utrecht_amsterdam_nederland
9 153 9_boek_lezen_boeken_duck
10 149 10_vakantie_hotel_park_ga
11 117 11_programma_tv_televisie_talkshow
12 114 12_inflatie_financiële_economen_overheid
13 103 13_telescoop_aarde_maan_mars
14 95 14_boeren_trekkers_agrarische_landbouw
15 92 15_minister_kabinet_president_wilders
16 88 16_rijden_auto_rijdt_fiets
17 87 17_duitsland_ddr_duitsers_duitse
18 84 18_voetballen_voetbal_sport_formule
19 83 19_nederland_belgië_vlaanderen_inwoners
20 82 20_rutte_kabinet_motie_minister
21 77 21_twitter_media_facebook_sociale
22 73 22_zwarte_slavernij_zuidelijke_wit
23 72 23_vliegen_vliegtuig_piloot_toestel
24 71 24_podcast_luisteren_podcasts_klikken
25 69 25_geld_pensioen_banken_betalen
26 64 26_roken_sigaretten_sigaret_gerookt
27 64 27_tank_tanks_tiger_duitsers
28 64 28_stoommachine_stoommachines_water_stoom
29 59 29_vrouwen_mannen_meisjes_jonge
30 59 30_duitsers_piloten_toestellen_engelsen
31 59 31_energie_planeet_fossiele_klimaatopwarming
32 57 32_mussolini_italië_fascisme_italianen
33 55 33_merkel_duitsland_bondskanselier_brandt
34 54 34_trein_spoor_station_ov
35 51 35_gas_rusland_poetin_russische
36 49 36_belasting_betalen_overheid_nederland
37 49 37_irak_saddam_hussein_amerikanen
38 47 38_heilig_kerk_jezus_testament
39 46 39_museum_rembrandt_schilderijen_musea
40 46 40_juryrechtspraak_overheid_rechter_jury
41 45 41_krant_nrc_lees_volkskrant
42 44 42_sneeuw_koud_herfst_winter
43 44 43_kabinet_transparantie_parlement_kamer
44 43 44_licht_gloeilamp_led_stroom
45 43 45_vrouw_kaag_joke_hedy
46 41 46_water_moeras_west_droog
47 41 47_eten_eet_vlees_broodjes
48 40 48_dino_velociraptors_skeletten_sediment
49 39 49_telefoon_mobiele_iphone_telefoons
50 39 50_frankrijk_franse_fransen_vichy
51 38 51_leven_overleden_oud_geworden
52 38 52_churchill_winston_prime_macmillan
53 37 53_korea_noord_oorlog_koude
54 37 54_gorbachev_gorbatschow_sovjet_jeltje
55 36 55_dirigent_meta_schumacher_decadent
56 36 56_charles_koningin_elisabeth_fictie
57 34 57_postzegels_postzegel_verzamelen_series
58 33 58_godfried_thorbecke_bommans_oranje
59 33 59_auto_tesla_elektrische_elektrisch
60 33 60_gas_prijzen_energie_olie
61 33 61_vrouwen_emancipatie_mannen_vrouw
62 32 62_theater_publiek_uur_zaal
63 32 63_nucleaire_wapens_bom_uranium
64 32 64_neoliberale_overheid_beleid_wantrouwen
65 31 65_leipzig_duitsland_duits_stad
66 31 66_cocaïne_legalisering_alcohol_drugs
67 31 67_bier_thee_drinken_gedronken
68 30 68_rita_kaag_verdonk_voorzitter
69 30 69_kinderen_ouders_jongetjes_jongeren
70 29 70_eiland_walvis_zee_protocoll
71 29 71_iran_israël_cuba_crisis
72 29 72_sievert_siewert_tuu_rel
73 29 73_schiphol_klm_luchthaven_000
74 29 74_schrijven_schrijf_woorden_typen
75 28 75_bevolking_nederland_welvaart_inkomen
76 27 76_dood_leven_roman_vader
77 27 77_baudet_thierry_wilders_martijn
78 26 78_laptop_koffertje_camera_cd
79 26 79_kabouter_knol_meiland_smeets
80 25 80_afghanistan_taliban_kabul_sjiïtische
81 25 81_oma_vader_opa_bijnamen
82 25 82_teruggebeld_afspraak_telefoonnummers_bellen
83 24 83_baby_bevolking_mannen_redzaam
84 24 84_beren_stofwisseling_bellen_belt
85 23 85_amerika_europa_staten_verenigde
86 23 86_fortuyn_melkert_pim_herben
87 22 87_edison_gelijkstroom_tesla_wisselstroom
88 22 88_napoleon_frankrijk_handtekening_artillerie
89 22 89_uur_douchegordijn_balletjes_helmond
90 22 90_vietnam_vietcong_minh_amerikanen
91 22 91_boeken_amazon_com_bol
92 22 92_vuurwapens_vuurwapen_wapenvergunning_amerika
93 21 93_faraday_einstein_maxwell_genie
94 21 94_muziek_radio_klassieke_klootzchieten
95 20 95_password_qr_paswoord_schoenen
96 20 96_auto_steden_pick_infrastructuur
97 20 97_vliegen_trein_rij_schiphol

To demonstrate this further, we can check some of the classified minutes for the first 3 topics:

Show the code
for topic_i in range(1, 4):
    print(f"The topic is defined by:  **{topics.iloc[topic_i]['Name']}**" + "\n")
    example = " ".join(topic_model.get_representative_docs()[topic_i-1])
    print(f"Representative minute of podcast:\n\n _{example}_" + "\n\n")
    print("----------------------------------------------------------\n\n")

The topic is defined by: 0_oekraïne_rusland_poetin_russen

Representative minute of podcast:

tijdrekerij van de Lussen om ze de gelegenheid te geven om nog veel meer naar elkaar te schieten. Dat is eigenlijk het enige waar ze goed in blijken te zijn. Niet maar dat je een artillerie opstelling hebt en dat je een volstrekt onverdedigde flat waar mensen in wonen. Dat zijn sowieso wel vrij amoeiige flats, vind ik altijd, om die volledig in elkaar te schieten. Ze zijn niet goed in precisie. Nee, dat kun je wel zeggen. Het Russische leger is eigenlijk nergens goed in gebleken. Het was bereikbaar ook dat er toch groot toe aantallen gesneuveld zijn of gewond zijn geraakt. Het is ook zonderling dat je 14.000 krijgsgeharde serieus moet importeren om dit werk te gaan doen. Kom op, zeg. Die schijnen wel heel gevaarlijk te zijn. Ja, dat weet ik. Dat wordt dan gezegd. Serieus, oeh, heeft z’n keukenmes en dat is verschrikkelijk gewoon. Nou ja, dat zijn ook allemaal van die, De incompetente en gewetenloze Russische top sleept het eigen land mee in de afgrond. Ja, dat lijkt mij een heel juiste analyse van Laura Staring. Er wordt ook nog weleens gesproken over een tribunaal dat er moet komen voor de misdaden die daar in Oekraïne plaatsvinden. Ja, dat komt er natuurlijk niet, dat weet iedereen. Je slaat het daar niet over hebben. De grootste boeven worden nooit gestraft in de wereldgeschiedenis. Die worden op een andere manier gestraft, zal ik maar zeggen, maar dat zie ik nou niet zo gebeuren, eerlijk gezegd, want je ziet dat elke keer als de Oekraïnes het over tribunalen hebben, dan beginnen de Russen ook meteen in een tribunal, je kunt wel in tribunalen blijven, maar ongelukkig, je kunt je veel beter afvragen, nu ik het mezelf afvraag zie ik al wat een zinloze vraag het eigenlijk is, ja hoe is het toch wel eens mogelijk dat we altijd weer opgezadeld worden, niet waar, met halve garen op ons te regeren, hoe komt Ik pijl kennelijk onvoldoende de waanzin waar aan Poetin tempo is gevallen. Hij is gaan geloven in al die sprookjes die ze daar verspreiden over Rusland. En dat houdt natuurlijk samen met het immense minderwaardigheidscomplex wat ze overigens altijd hebben gehad. Dat is punt 1. En punt 2 is natuurlijk nog versterkt door het ineenstorten van de Sovjerdunie. En de chaos die daar jarenlang op gevolgd is. Maar ik weet niet, ik geloof of dat dan Kissinger was of iemand anders. Die zei ja, de Russen, dat is altijd bij onderhandelingen hebben, ook in die detante tijdperk. De Russen die willen er altijd echt over serieus genomen en erbij horen. En dat komt omdat ze hier een minderwaardigheidscomplex hebben van hier tot Gunde. Wat volgens mij Poetin ook heeft, als ik het goed zie. En de Chinezen waren altijd zo arrogant als de pest. Ze waren ervan overtuigd dat ze veel beter en intelligenter…


The topic is defined by: 1_china_taiwan_chinezen_xi

Representative minute of podcast:

Heb je dat ook uitgelegd? Nou, hij noemde onder andere natuurlijk de dreiging… …die misschien nu niet meteen zichtbaar is en voelbaar is… …maar neem bijvoorbeeld in China. Je dacht dat de Chinese pantserdivisies… …via die spoorlijn in Rotterdam uitstappen… …en naar Nederland gaan verbouweren. Misschien niet de fysieke dreiging. Er is geen directe militaire bedreiging… …van West-Europa door China. Als er überhaupt sprake is van een Chinese militaire dreiging… …betreft dat de Chinese zee. En dat is op zichzelf wel een interessant probleem. Hoeveel willen de Amerikanen daartegen doen, hoe weinig… …maar dat betreft onze West-Europianen staan daar volledig buiten. Ja, maar misschien heb je een ouderwetse opvatting van defensie… …namelijk met geweren en tanks en pistolen. Ik denk dat hij misschien meer doelt op de digitale dreiging. De AI. De volgende oorlog wordt niet gevoerd fysiek… …maar digitaal. Tell me, net als die lulkoekerij over die zelfbesturende auto’s… …die aan de lopende band mensen doodrijden in Californië. Nee, nee, nee. Ik geloof niet dat in mijn studietijd het woord China ooit gevallen is. Ik geloof het niet, eerlijk gezegd. En nu is China alles. Je hebt nu ook world history. Beetje van de big bang tot… van alles en nog wat. Het curriculum is grondig veranderd. Wat was bij ons belangrijk? Het was natuurlijk dat je leerde wat over de republiek. Spreek vanzelf. Ik weet niet of dat überhaupt nog gedaan wordt. Er wordt niet allemaal verdachtspul tegenwoordig. Jan Pieters z’n Coen. Moordpartijen. De VOC. Slavernij. Ook wat we hoorden, toch betrekkelijk waar je wist dat bestond. Je wist dat de Nederlandse republiek daar wel aan gedaan had. Maar veel minder dan andere landen in Europa, mag ik tegenwoordig ook al niet zeggen. Nou ja, dan had je de Franse revolutie. Dat was een ontzettend belangrijke kwestie. Zeg maar, de politieke en culturele effecten van de Franse revolutie in de 19e eeuw. En dan natuurlijk bovenal centraalstaande opkomst van Azi-Duitsland. Ten eerste is dat niet helemaal zeker, want dat hangt er af of je kijkt naar de valutakoers, of dat je kijkt naar koopkrachtpariteit. Naar koopkrachtpariteit is de Chinese economie de grootste ter wereld. Daar bestaat geen twijfel over. Als je kijkt naar valuta, dan is dat in mindere mate het geval. Als deel van de wereldeconomie, daar hebben we het volgens mij ook al over gehad, is China zoiets als de Verenigde Staten en de Europese Unie. Want gek is, je leest alleen over de Verenigde Staten en de Europese Unie, alsof dat de enige rozachtige economische eenheden in de wereld zijn. Maar we hebben er nog een, daar zijn we zelf lid van. Dat een deel van de krankzinnige bevolking van Nederland daar weer uit wil, dat is nou weer wat anders. Daar zullen we het vandaag niet over hebben. Om te wensen dat we uit de EU stappen, moet je zo krankzinnig zijn dat er verder ook geen discussie over mogelijk is in dit verband. Ik zeg het even tussen haakjes. Zolang rechts in Nederland, zolang zeer rechts in Nederland,


The topic is defined by: 2_vvd_partij_cda_kabinet

Representative minute of podcast:

En laten we eerlijk zijn, die partijtjes GroenLinks, Klaver heeft 77 gewonnen en is ook weer verloren. Niet waarom die strategisch dat verkeerd heeft aangepakt naar mijn idee. En de Partij van Arbeid, dat weten we nu langsmaand, zal zich niet meer herstellen vanuit deze dwergpositie. Dus in godsnaam, al is het dan maar als wanhopig offensief, werk samen. Forme één partij, die is waarschijnlijk wat kleiner dan de drie partijen samen, maar forme één partij, dan kun je in ieder geval bij formatieonderhandelingen een vuist maken. Ja, denk je niet, want er is natuurlijk ook kans dat er net als bij rechts ruzie komt tussen die partijen. Ja, dat kan. Ruzie is natuurlijk kinderpolitiek een vrij veel voorkomend verschijnsel, sterker nog. Sowieso is ruzie een vrij algemeen menselijk verschijnsel. Ja, dat klopt. Even een andere vraag, heb jij tijdens jouw tijd op de universiteit meegemaakt dat er jalozie was over spreekbeurten die jij deed, Ik vind het zelfs helemaal geen echte VVD, het is gewoon een conservatief uit de conservatieve elite. Hij ziet er blits uit en hij loopt toch ook hard en zo. Al die dingetjes die er tegenwoordig bij horen, of je conservatief bent, ja of nee. Maar nee, ik vind het geen aanwinst. Je bedoelt CDA, want je zei VVD, maar je bedoelt CDA. Ja, voor het CDA ook niet. Het CDA zegt toch altijd dat ze willen toch de planeet op een verantwoordelijke wijze beheren, zoals de ere Jezus het graag ziet. Nou, ik heb al vaker gezegd wat precies de inzet van het CDA is voor het beheer van de planeet. Dat is mij nooit duidelijk geworden dat ik een aartsconservatieve, volledig agrarisch gerichte partij is geworden. Is Kaag nou een winnaar of een verliezer? Zij moest noodzakelijke wijs van dit spel de verliezer worden. Maar ze kan natuurlijk nog in de onhandelingen de buit binnenhalen. …terwijl ze het niet bij het rechte eind hadden… …en tal van mensen heel samenhangende… …en relevante kritiek op dat beleid… …gehaald hebben zonder dat het effect had. Maar je mag er ook wel van mening… Ik vind het nog steeds hoogst betreuringswaardig… …dat de KPVNA vijf jaar lang in een kabinet… …met de VVD gezeten heeft… …en daarbij een groot deel van zijn sociale principes… …systematisch vergraaien heeft. Maar je mag er ook wel als politieke partij… …van gedachten veranderen door de situatie… …die in de wereld ontstaat. De excuses zouden leuk zijn… …omdat het dan ook een beetje duidelijk wordt… …dat ze niet altijd deze ideeën hebben verdedigd. Integendeel… …dat ze natuurlijk horen tot dat brede deel… …van de politiek die in feite… …zeg maar rustig sinds de late jaren 70… …of vanaf de begin van de jaren 80… …steeds beweerd hebben dat de overheid… …niet de oplossing van een probleem is… …maar dat de overheid zelf het probleem is. Hoe minder overheid, hoe beter. En nu weten we ondertussen… …hoe minder overheid, hoe beter. Dan is het alleen aan de staat. Ik vind het wel precies, dat is een mooi punt… …en wat inderdaad wel goed is…


Yep, those fit really well! Something really cool we can do next is to visualize all these topics to also give you a sense of how they are all related.

The topic is defined by: 0_oekraïne_rusland_poetin_russen

Representative minute of podcast:

tijdrekerij van de Lussen om ze de gelegenheid te geven om nog veel meer naar elkaar te schieten. Dat is eigenlijk het enige waar ze goed in blijken te zijn. Niet maar dat je een artillerie opstelling hebt en dat je een volstrekt onverdedigde flat waar mensen in wonen. Dat zijn sowieso wel vrij amoeiige flats, vind ik altijd, om die volledig in elkaar te schieten. Ze zijn niet goed in precisie. Nee, dat kun je wel zeggen. Het Russische leger is eigenlijk nergens goed in gebleken. Het was bereikbaar ook dat er toch groot toe aantallen gesneuveld zijn of gewond zijn geraakt. Het is ook zonderling dat je 14.000 krijgsgeharde serieus moet importeren om dit werk te gaan doen. Kom op, zeg. Die schijnen wel heel gevaarlijk te zijn. Ja, dat weet ik. Dat wordt dan gezegd. Serieus, oeh, heeft z’n keukenmes en dat is verschrikkelijk gewoon. Nou ja, dat zijn ook allemaal van die, De incompetente en gewetenloze Russische top sleept het eigen land mee in de afgrond. Ja, dat lijkt mij een heel juiste analyse van Laura Staring. Er wordt ook nog weleens gesproken over een tribunaal dat er moet komen voor de misdaden die daar in Oekraïne plaatsvinden. Ja, dat komt er natuurlijk niet, dat weet iedereen. Je slaat het daar niet over hebben. De grootste boeven worden nooit gestraft in de wereldgeschiedenis. Die worden op een andere manier gestraft, zal ik maar zeggen, maar dat zie ik nou niet zo gebeuren, eerlijk gezegd, want je ziet dat elke keer als de Oekraïnes het over tribunalen hebben, dan beginnen de Russen ook meteen in een tribunal, je kunt wel in tribunalen blijven, maar ongelukkig, je kunt je veel beter afvragen, nu ik het mezelf afvraag zie ik al wat een zinloze vraag het eigenlijk is, ja hoe is het toch wel eens mogelijk dat we altijd weer opgezadeld worden, niet waar, met halve garen op ons te regeren, hoe komt Ik pijl kennelijk onvoldoende de waanzin waar aan Poetin tempo is gevallen. Hij is gaan geloven in al die sprookjes die ze daar verspreiden over Rusland. En dat houdt natuurlijk samen met het immense minderwaardigheidscomplex wat ze overigens altijd hebben gehad. Dat is punt 1. En punt 2 is natuurlijk nog versterkt door het ineenstorten van de Sovjerdunie. En de chaos die daar jarenlang op gevolgd is. Maar ik weet niet, ik geloof of dat dan Kissinger was of iemand anders. Die zei ja, de Russen, dat is altijd bij onderhandelingen hebben, ook in die detante tijdperk. De Russen die willen er altijd echt over serieus genomen en erbij horen. En dat komt omdat ze hier een minderwaardigheidscomplex hebben van hier tot Gunde. Wat volgens mij Poetin ook heeft, als ik het goed zie. En de Chinezen waren altijd zo arrogant als de pest. Ze waren ervan overtuigd dat ze veel beter en intelligenter…


The topic is defined by: 1_china_taiwan_chinezen_xi

Representative minute of podcast:

Heb je dat ook uitgelegd? Nou, hij noemde onder andere natuurlijk de dreiging… …die misschien nu niet meteen zichtbaar is en voelbaar is… …maar neem bijvoorbeeld in China. Je dacht dat de Chinese pantserdivisies… …via die spoorlijn in Rotterdam uitstappen… …en naar Nederland gaan verbouweren. Misschien niet de fysieke dreiging. Er is geen directe militaire bedreiging… …van West-Europa door China. Als er überhaupt sprake is van een Chinese militaire dreiging… …betreft dat de Chinese zee. En dat is op zichzelf wel een interessant probleem. Hoeveel willen de Amerikanen daartegen doen, hoe weinig… …maar dat betreft onze West-Europianen staan daar volledig buiten. Ja, maar misschien heb je een ouderwetse opvatting van defensie… …namelijk met geweren en tanks en pistolen. Ik denk dat hij misschien meer doelt op de digitale dreiging. De AI. De volgende oorlog wordt niet gevoerd fysiek… …maar digitaal. Tell me, net als die lulkoekerij over die zelfbesturende auto’s… …die aan de lopende band mensen doodrijden in Californië. Nee, nee, nee. Ik geloof niet dat in mijn studietijd het woord China ooit gevallen is. Ik geloof het niet, eerlijk gezegd. En nu is China alles. Je hebt nu ook world history. Beetje van de big bang tot… van alles en nog wat. Het curriculum is grondig veranderd. Wat was bij ons belangrijk? Het was natuurlijk dat je leerde wat over de republiek. Spreek vanzelf. Ik weet niet of dat überhaupt nog gedaan wordt. Er wordt niet allemaal verdachtspul tegenwoordig. Jan Pieters z’n Coen. Moordpartijen. De VOC. Slavernij. Ook wat we hoorden, toch betrekkelijk waar je wist dat bestond. Je wist dat de Nederlandse republiek daar wel aan gedaan had. Maar veel minder dan andere landen in Europa, mag ik tegenwoordig ook al niet zeggen. Nou ja, dan had je de Franse revolutie. Dat was een ontzettend belangrijke kwestie. Zeg maar, de politieke en culturele effecten van de Franse revolutie in de 19e eeuw. En dan natuurlijk bovenal centraalstaande opkomst van Azi-Duitsland. Ten eerste is dat niet helemaal zeker, want dat hangt er af of je kijkt naar de valutakoers, of dat je kijkt naar koopkrachtpariteit. Naar koopkrachtpariteit is de Chinese economie de grootste ter wereld. Daar bestaat geen twijfel over. Als je kijkt naar valuta, dan is dat in mindere mate het geval. Als deel van de wereldeconomie, daar hebben we het volgens mij ook al over gehad, is China zoiets als de Verenigde Staten en de Europese Unie. Want gek is, je leest alleen over de Verenigde Staten en de Europese Unie, alsof dat de enige rozachtige economische eenheden in de wereld zijn. Maar we hebben er nog een, daar zijn we zelf lid van. Dat een deel van de krankzinnige bevolking van Nederland daar weer uit wil, dat is nou weer wat anders. Daar zullen we het vandaag niet over hebben. Om te wensen dat we uit de EU stappen, moet je zo krankzinnig zijn dat er verder ook geen discussie over mogelijk is in dit verband. Ik zeg het even tussen haakjes. Zolang rechts in Nederland, zolang zeer rechts in Nederland,


The topic is defined by: 2_vvd_partij_cda_kabinet

Representative minute of podcast:

En laten we eerlijk zijn, die partijtjes GroenLinks, Klaver heeft 77 gewonnen en is ook weer verloren. Niet waarom die strategisch dat verkeerd heeft aangepakt naar mijn idee. En de Partij van Arbeid, dat weten we nu langsmaand, zal zich niet meer herstellen vanuit deze dwergpositie. Dus in godsnaam, al is het dan maar als wanhopig offensief, werk samen. Forme één partij, die is waarschijnlijk wat kleiner dan de drie partijen samen, maar forme één partij, dan kun je in ieder geval bij formatieonderhandelingen een vuist maken. Ja, denk je niet, want er is natuurlijk ook kans dat er net als bij rechts ruzie komt tussen die partijen. Ja, dat kan. Ruzie is natuurlijk kinderpolitiek een vrij veel voorkomend verschijnsel, sterker nog. Sowieso is ruzie een vrij algemeen menselijk verschijnsel. Ja, dat klopt. Even een andere vraag, heb jij tijdens jouw tijd op de universiteit meegemaakt dat er jalozie was over spreekbeurten die jij deed, Ik vind het zelfs helemaal geen echte VVD, het is gewoon een conservatief uit de conservatieve elite. Hij ziet er blits uit en hij loopt toch ook hard en zo. Al die dingetjes die er tegenwoordig bij horen, of je conservatief bent, ja of nee. Maar nee, ik vind het geen aanwinst. Je bedoelt CDA, want je zei VVD, maar je bedoelt CDA. Ja, voor het CDA ook niet. Het CDA zegt toch altijd dat ze willen toch de planeet op een verantwoordelijke wijze beheren, zoals de ere Jezus het graag ziet. Nou, ik heb al vaker gezegd wat precies de inzet van het CDA is voor het beheer van de planeet. Dat is mij nooit duidelijk geworden dat ik een aartsconservatieve, volledig agrarisch gerichte partij is geworden. Is Kaag nou een winnaar of een verliezer? Zij moest noodzakelijke wijs van dit spel de verliezer worden. Maar ze kan natuurlijk nog in de onhandelingen de buit binnenhalen. …terwijl ze het niet bij het rechte eind hadden… …en tal van mensen heel samenhangende… …en relevante kritiek op dat beleid… …gehaald hebben zonder dat het effect had. Maar je mag er ook wel van mening… Ik vind het nog steeds hoogst betreuringswaardig… …dat de KPVNA vijf jaar lang in een kabinet… …met de VVD gezeten heeft… …en daarbij een groot deel van zijn sociale principes… …systematisch vergraaien heeft. Maar je mag er ook wel als politieke partij… …van gedachten veranderen door de situatie… …die in de wereld ontstaat. De excuses zouden leuk zijn… …omdat het dan ook een beetje duidelijk wordt… …dat ze niet altijd deze ideeën hebben verdedigd. Integendeel… …dat ze natuurlijk horen tot dat brede deel… …van de politiek die in feite… …zeg maar rustig sinds de late jaren 70… …of vanaf de begin van de jaren 80… …steeds beweerd hebben dat de overheid… …niet de oplossing van een probleem is… …maar dat de overheid zelf het probleem is. Hoe minder overheid, hoe beter. En nu weten we ondertussen… …hoe minder overheid, hoe beter. Dan is het alleen aan de staat. Ik vind het wel precies, dat is een mooi punt… …en wat inderdaad wel goed is…


The topic is defined by: 3_trump_republikeinen_biden_president

Representative minute of podcast:

maar bij Trump was het alle dagen bal. Ik denk zelf, als je het moet beoordelen, hoe die vier jaren dat Trump er gezeten heeft, nou, laten we beginnen met het eind. Een van de ergste dingen die hij gedaan heeft is die langdurig tot op de dag van vandaag volgehouden leugen, dat hij eigenlijk gewonnen heeft, maar niet verloren heeft. Iets waar hij eigenlijk mee begonnen was al vier jaar eerder. Hij zei, als ik verlies, dan komt het omdat ik belazerd ben. Ik ben Trump, ik kan helemaal niet verliezen, dat was toch het idee. Dat heeft hij ook in die vier jaar gezet, ik ga weer deelnemen. Je zult zien, als ik verlies, dan zijn de democraten erin geslagen om mijn overwinning te ontstelen. Nou, dat is gebeurd. Hij heeft ook geen moment gehaseld om te zeggen, het is gestolen. Nee. Nou ja, bij Trump kan dat dus wel, maar hij is vier jaar geweest. Nou, die blijft gewoon zitten, hè. Die gaat gewoon lekker acht jaar door. Ja, het is schandelijk. Wat ze doen is echt schandelijk. Ze weten natuurlijk heel goed dat ze verloren hebben, maar ze jutten natuurlijk hun electoraat op om boos te worden. En dat werkt, hè? En dat werkt geweldig. Dat werkt geweldig. Want ik hoorde op de televisie… Je mag het niet zeggen, maar het electoraat is natuurlijk ook oliedom, hè. Het zijn natuurlijk wel degelijk deplorables, anders kun je het niet noemen. Kijk, weer een telefoon. Telefoon voor de himmelisch. Hallo. Telefoon voor de himmelisch. Even kijken wat we hier hebben. Ik moet wel zeggen, je bent ontzettend handig met dat ding. Ja. Ja. Ja, ik ben met de podcast net begonnen. Dan bel ik als ik klaar ben met de podcast. Is dat goed? Jo. Aju. Die mensen me afvragen, wat is dat toch, die podcast? Wat heeft die toch steeds over? Nou, dat zien mensen als een indicatie voor, laten we zeggen, de Republikeinse positie… …bij de tussentijdse verkiezingen van volgend jaar in november. Als zij dat dus handig aanpakken, die Republikeinse kandidaten. En met name in een staat als Virginia, waar in principe beide partijen wel kans hebben… …en die Republikeinse kandidaten spelen erop dat ze een beetje afstand van Trump houden… …en zeggen, moet je eens kijken, die Biden heeft er ook niet veel van terechtgebracht gesteld… …dat de economische situatie, die overigens helemaal niet zo verschrikkelijk slecht is… …over de hele linie gezien, macro-economisch, dat dat nog steeds voor veel mensen pijn voorzaakt… …dan hebben ze een goede kans natuurlijk om, hetzij in het huis, hetzij in de Senaat… …in de meerderheid te komen, ten meer omdat zowel in de Senaat als in het huis de verschillen minimaal zijn. Dus er hoeft maar dit te gebeuren en huppakee. Dus ze profiteren van de economische omstandigheden.


The topic is defined by: 4_hitler_duitsers_wereldoorlog_duitsland

Representative minute of podcast:

Omdat natuurlijk allerlei woorden nog steeds uit het nazi-arsenaal nog steeds op een heel ongelukkige wijze resoneren. Precies, daar refereert Henrik ook aan, Henrik Bronckhorst, die zegt treinmachinist heet in Duitsland ook nog Führer. Zeker, dat is een lok Führer. Zo is dat. Hij geeft dan weer een hele andere betekenis aan de uitspraak Führer wir folgen. Ja, dat kun je wel zeggen. Daar moet je dan maar niet te veel over nadenken. Maar je hebt hetzelfde natuurlijk in Italië met het woord Duce, wat ook leider betekent. En ja, dat was Benito Mussolini. Gelukkig hebben we in Nederland niet zo iemand. Als we het over Drees hebben, dan kun je niet zeggen dat was de leider van het vaderland. Nee, dat is gewoon een minister-president die zijn best heeft gedaan. Mark Rutte die gaat waarschijnlijk door. Ja, ik begreep ook dat hij probeert dat zo lang mogelijk geheim te houden, omdat hij dan ten slotte toch weer partijman zou zijn. Maar goed, we weten allemaal natuurlijk al heel lang dat hij doorgaat. Slimme zet? geen klaar in hout van achteraf gezien maar ja we zijn gevoelig voor de conventional wisdom maar dat vroeg je niet je vroeg iets anders ja we hadden het nog even over Hitler en dat jij zei zonder die press ja het probleem was dat dat is ja dat er eindeloze verkiezingen zijn in de Weimarrepubliek en dat ja dat moet je toch Hitler en de NSDAP nageven waren geweldige campaigners Hitler was een geweldige campaigner fantastische spreker de eerste politicus die het vliegtuig gebruikte dus zorgens sprak hij in Hamburg in de loop van de middag sprak hij in Hanover en vanavond sprak hij in München en altijd de duizenden mensen zei ik je moet je moet vaak betalen om naar hem te komen luisteren en werd ook voor betaald ja dus ja het is de crisis die er tenslotte natuurlijk echt toe geleid heeft dat de dat de NSDAP dat die uiteindelijk in ik denk na jaar 32 toen we zo’n 30 procent amphibische operatie ook een rol hebben gespeeld en ten slotte, en daarmee raken we dan aan de Battle of Britain, als de Duitsers dat dan zouden willen doen, dan zou dat natuurlijk ergens in het zuidoosten van het eiland zou die amphibische operatie moeten worden uitgevoerd en dat zou sowieso niet kunnen als de Duitsers niet tevoren de superioriteit in de lucht zouden hebben veroverd op de Engelsen en daar gaat de Battle of Britain over, zijn de Duitsers in staat om de Engelsen in de lucht te verslaan op de zodanige manier dat als die amphibische operatie ooit zou worden uitgevoerd, nogmaals dat was altijd toch een beetje mister, dat dan de Duitsers ook de meesters in de lucht zouden zijn, het was duidelijk al in de Tweede Wereldoorlog serieus aanvallend vechten zonder luchtsteun, dat kon je wel vergeten, denk


The topic is defined by: 5_auto_ford_motor_porsche

Representative minute of podcast:

Maar je kon tientallen verschillende soorten kachels krijgen voor de T-Ford. Maar het belang van de T-Ford lag hem natuurlijk niet in het ontwerp. Het is ook nogmaals te lang doorgebouwd. Het belang van de T-Ford lag in het feit dat Ford een heel nieuw productiesysteem had ontworpen. Waarbij de prijs van de T-Ford begon met 850 dollar. En eigenlijk binnen tien jaar was de prijs gehalveerd. Terwijl hij nogal wat verbeterd was, was de prijs gehalveerd. En dat niet alleen. Maar Ford had enorme problemen met het verloop van zijn arbeiders. In die Highland Park Factory, hoe mooi die er ook uitzag. Kennelijk was het al ontzettend klote werk aan die lopende band. Dat was ook zo. Daar lag natuurlijk een forse druk op om aan de slag te blijven. En toen heeft Ford iets gedaan wat ook als revolutionair werd beschouwd. Namelijk het uurloon van zijn arbeiders verdubbeld. Van 2 dollar 50 naar 5 dollar. In de terugblik naar de Tweede Wereldoorlog is toch duidelijk geworden. Dit was een Engels autootje, een zogenaamd Engels autootje, namelijk een nieuwe Mini. En we weten allemaal dat was oorspronkelijk een van de meest succesvolle auto’s die de Britse auto-industrie na de Tweede Wereldoorlog heeft geproduceerd. Dat bedrijf wat dat deed is uiteindelijk op elkaar gevallen, failliet gegaan naar de bekende Engelse ruïne. Wat is daarvan gemaakt? Die Mini naam en het idee is overgekocht door BMW en die heeft er een miljoenen succes van gemaakt. Wat je aanziet, kijk eens even. Je kunt er iets van maken en dat is de Duitse auto-industrie. Wat natuurlijk tegen de achtergrond van het verhaal wat ik nu ga vertellen is dat eigenlijk wel een wonderlijk verhaal natuurlijk, dat de uiteindelijke overwinnaar van de Tweede Als die ooit in de Verenigde Staten is, is er in Dearborn een groot openluchtmuseum. Wat begonnen is door Henry Ford. En daar zie je een heel aardige T-Ford. Die kan in zijn onderdelen uit elkaar vallen. Daar zie je hoe dat ding primitief in elkaar zat. We hadden uitstekende terreineigenschappen. Wielen die konden hadden echt een bewegingsvrijheid waar je u tegen zegt. Heel anders dan tegenwoordig natuurlijk. We hebben speciale terreinvoertuigen. De T-Ford was een tiptop terreinvoertuig. Bovendien ontstond er al heel snel door die enorme productieaantallen een toeleveringsindustrie. Die echt alles kon leveren voor de T-Ford die je maar wou. Je kon de T-Ford ook gebruiken als een maaïdorsmachine. Of als aandrijver van een maaïdorsmachine. Dan kon je een soort van tandwiel kopen. Dan kon je erop schroeven, een band en zo. Het was ongelofelijk. Hij werd ook zonder kachel geleverd.


The topic is defined by: 6_onderwijs_school_geschiedenis_middelbare

Representative minute of podcast:

Documentaires op de televisie boeken en verschijnen dan een lopende band. Dat is een enorme productie van interessante historische titels. En dan zijn wij nog niet eens zo actief als bijvoorbeeld namelijk in Engeland. Dat is natuurlijk een fantastische productie. En ook heel veel goedschrijvende, hoogste interessante historische actieven. Dus ja, de belangstelling is er wel. Ik moet ook zeggen, geschiedenis vind ik heel interessant. Maar op de middelbare school werd het toch zo saai gegeven dat je dacht van… Ja, dat is een groot probleem natuurlijk. Nou ja, ik heb dat volgens mij wel eens verteld. Ik heb in de eerste twee jaar van de middelbare school een fantastische leraar gehad, meneer de Jong. Al lang en breed dood, maar mocht hij in de hemel luisteren naar deze bijzonderheidszending. En volgens mij wordt hij daar heel goed beluisterd voor zijn werk. Dat weet ik nog eens. Dank u wel meneer de Jong voor het fantastische onderwijs dat ik die eerste twee jaar genoten heb. En wat mij toch eigenlijk mijn historische belangstelling wel vastgezet heeft in mijn ziel. En het wordt ook gevierd als je het hebt hè, diploma, kijk eens hoe gaaf ik. Ja, ik weet er alles van. Ja, het diploma technisch kan ik niet hoger stijgen, dus van dat gedonde ben ik af in ieder geval. En het is zo belangrijk is, dat ontzettend veel mensen hebben gedroomd van het feit dat ze het diploma wat ze best hebben, dat ze dat niet hebben. Dat ze hun eindexamen bijvoorbeeld niet hebben gedaan, of dat ze hun dokteralexamen niet hebben gedaan. Nou ja, ik heb ook vaak gedroomd dat ik mijn eindexamen eigenlijk niet had gedaan, dus dat ik in feite een oplichter was, dat ik was studeerder, maar ja, ik voldeed volstrekt niet aan de officiële voorschriften. Ja, wonderlijk toch. Vanaf het moment dat ik gepromoveerd ben, heb ik nooit meer gedroomd van enig opleidingstechnisch probleem. Nooit meer. En wanneer wordt er ooit gevraagd naar je diploma? Nooit. Wat dat betreft is het net hetzelfde met de Covid vaccinatie. Het aantal college’s wat beluisterendswaardig was, was zeer beperkt. Je had er wel bij die een zekere toneelmatige uitstraling gehad. Je had Tiel, dat was wel oude geschiedenis, dat was wel lollig, moet ik zeggen. Daar ging je wel met plezier heen. Boogman gaf goed college, al deze mensen zijn dood. Dus wat dat betreft, het is niet zo dat de mensen weer mee zijn van, god, we gaan dus naar Tiel luisteren. Nee, dat kan niet meer. Tiel, ze hadden toen allemaal nog tentamen aan huis. En Tiel stelde dan een paar vragen. Hij woonde, als ik het wel, op aan de Homerenslaan. En als je er niet veel van terechtbracht, dan keek hij naar buiten en zei hij, zo te zien haalt u lijn 3 nog wel, als u nu snel vertrekt. Wat is tentamen aan huis? Dat je tentamen deed bij de professor thuis. Serieus? Ja, allemaal. Ik heb alle tentamens bij de professor thuis gedaan, behalve middeleeuwen.


The topic is defined by: 7_gevaccineerd_vaccineren_vaccin_vaccinatie

Representative minute of podcast:

is en het aantal besmettingen is is fors nog steeds echt fors ja waardoor de overheid denk niet zo gauw zal zeggen nou weg maar met de avondklok nee we gaan even kijken naar de brieven die dat binnenkomen de meeste vragen die eigenlijk gesteld worden gaan ook over wat vond je van alle ophef over het vaccineren dat is een beetje wat er doorheen klinkt ja wat vond ik daarvan ik was het totaal verrast we hadden dat vorige week vrijdag precies een week geleden had ik dat nogal komische verhaal verteld van het kan wel kon niet kan wel kon niet wat toch vrij komisch was zonder dat ik ook mijn de verste verte had verwacht wat het effect zou zijn dus ik stond de volgende dag op ik ging achter mijn bureau zitten nou ja ik geloof dat ik 35 keer gebeld ben door alle media die is nou ik geloof dat de enige die niet gebeld heeft was omroep Friesland bij wijze van spreken het was ongelooflijk werkelijk en of ik dat uit wil komen leggen enzovoort nou ik ben het gaan uitleggen had ik trouwens moeite genoeg om het überhaupt het verhaaltje even af te maken wat ik ook Hans Schoo, die gaat nu het kabinet vragen om het wettelijk mogelijk te maken om het personeel wel te vragen naar de vaccinatiestaten. Ik ben al tijdenlang een warm voorstander van een vaccinatiebewijs. Als jij je niet wilt laten vaccineren vind ik dat prima, maar dat betekent wel dat je nergens naar binnen kunt. Bedrijven gaan natuurlijk ook een vaccinatie ijs stellen. Als jij een pakketje aan de deur krijgt vind ik het toch ook wel vrij prettig dat je niet een superspreader aan de deur krijgt. Dus ja, daar zullen ook ijsdagen worden gesteld. En dat geldt in hoge mate voor toegang tot theaters en het nachtleven enzovoort. Zorg dat je gevaccineerd bent. Zo niet, dan mag je jammer genoeg niet naar het theater en het nachtleven. Misschien kunnen we een heel apart nachtleven organiseren op Urk. Bij geen enkele vorm van ijs wordt gesteld dat iedereen kan komen, liefst niet gevaccineerd. Dat je daar een bewijs moet laten zien dat je niet gevaccineerd bent. Dat je een teststraat in de fik hebt gestoken. Dat je een held bent van het corona-verzet. dus in de Varossum groep, deelt die wat er dus rondgestuurd wordt. Ja. En stuurt die, weet je wat het is? Haast alle mensen, kinderen, die allemaal gevaccineerd zijn, dan staat de toekomst van de mensheid op het spel, zegt dus zo’n Forum voor Democratie type. Als ze allemaal gevaccineerd zijn. Ja, want we hebben nu al heel veel miskramen, onvruchtbaarheidsklasten enzovoort. Wat als je bloed toegediend moet krijgen als ongevaccineerde van een gevaccineerde? Dan is het balletje rond. Ja, ik begrijp het, ja. En een uniek warhoofd. Ja, dat zal ik altijd zeggen. Ik heb het al zo gezegd. Het is een partij die altijd beklagen staat voor opmerkelijk variëteeteater van een zo grote waanzin dat je altijd verbaasd bent wat ze bij elkaar bedacht hebben. Het is echt een unieke partij in dat opzicht. Het is geen politieke partij natuurlijk. Het is in feite een soort cabaretgroep. Ik denk dat je het veel beter zo kunt zien. Oké, dus dit verbaast je niet, dit soort gedachten? Nee, totaal niks.


The topic is defined by: 8_stad_utrecht_amsterdam_nederland

Representative minute of podcast:

Ja, dus wat dat betreft is Utrecht dus opgestegen van in feite een mislukking, zou je haast zeggen, naar ongekend succes. Het is echt, als je ook de bedrijvenmix, je kunt in Utrecht niks bekijken of het draait als een tierenlier. En dat heeft natuurlijk een heel interessante oorzaak, omdat dit fenomeen zich in tal van grote steden in Amerika en in Europa heeft voorgedaan. Omdat, wat denkt u nu, dat de grootste werkgever van de stad is? Ja, dat is een interessante vraag, hè. Dat is de universiteit. Sterker nog, een onderdeel van de universiteit, namelijk de UMC. Nou, als er nou één goede industrie is, dan is het natuurlijk dat je die hele generatie van baby boomers naar de dood moet begeleiden, hè. Het UMC is de op één na grootste werkgever van de stad, dat is natuurlijk ook zelf vrij komisch. en die in Maastricht het station uitkomt en richting de binnenstad loopt, die ziet natuurlijk in dertig seconden dat je in het buitenland bent. De dakbedekking is anders, de architectonische stijl is anders. Je kunt de bewoners van Maastricht maar voor een keer totaal niet bestaan. Ja, het is het buiten komen op dat vrije tol of kijk naar die kerken. Het is buitenland, duidelijk, dat zie je meteen. Maar dat is ook wel een beetje de charme van Limburg. Laat ik ook eens iets positiefs over Willem. Dat we een stukje buitenland in Nederland hebben. Heb je nooit, als je met de trein naar Maastricht gaat, dat op een goed moment kijk je naar buiten en dan begint dat land te heuvelen. Dan zie je ineens, dit is die hele plottigheid van Nederland. Je gaat naar beneden met de trein. Ja, het gaat heuvelen. En dan denk je, dit is buitenland. We hadden eigenlijk nog een paar wat hogere bergen erbij moeten hebben. Dit is buitenland. Dan loop je Maastricht in en dan weet je, dit is een buitenlandse stad. Na de keiweek, de introductieweek, was er al sprake van het Maarten van Rossum effect. Maar dat was er niet. Er was een record aantal studenten had zich aangemaakt. Ja, want je weet dat dat voor het begin van het studiejaar in heel Nederland een record is. Het is niet speciaal een record in Groningen. Het is een nationaal record, dat wel. Ja, wat moeten die kinderen anders, die gaan maar studeren natuurlijk. Ik zag in een filmpje, ze hebben een heel mooi pand daar in Groningen aan de markt. Het is een nieuw pand, ze hebben het oude pand afgebroken. Het stond op een ietsje andere plek. Met zicht op de kerk. Geen enkel pand veranderd, verouderd zo snel als een pand waar studenten dagelijks verkeerden. Als je bijvoorbeeld een huis hebt en je wilt het uit laten wonen, dan moet je 14 studenten huren. En dan moet je er vijf jaar in laten wonen. Dan mag je blij zijn dat het niet spontaan aan elkaar stort. Hier op de hoek van de straat is toch ook zo’n pand? Ja. En even kijken, wat had die… Het viel mij op veel bekende oudleden.


The topic is defined by: 9_boek_lezen_boeken_duck

Representative minute of podcast:

Zoeken het even op, ja. Heel fijn dat we het even op kunnen zoeken. Ik denk ook vaak dat mensen in de zaal kunnen ook meteen even iets opzoeken… als ik het niet helemaal meer zeker weet. Hoe heette dat boek, wat jij zei? Brief van de koning, brief van de koning, geloof ik. Brief van de koning. Nee, dat is geloof ik niet Thea Beckman. Ik krijg geen hit als ik het intik. Brief van de koning. Zo. Tonke Dracht staat hierbij. Tonke Dracht, precies. Dat is wat ik bedoelde. Dus dat is niet Thea Beckman. Tonke Dracht heb ik aan mijn kinderen voorgelezen. Die waren daar goed over te spreken. Dat was wel een succes, die voorlezerij. Ik heb sowieso heel veel voorgelezen. Hier werden ze niet medelijks van? Nee, ze hadden niet wat je bij Niels Holgersson… dat je dacht van dit vinden ze echt niet opwindend, deze lectuur. Dat had je ook wel bij sommige passages van Lord of the Rings. aankaarten, en toen viel mijn oog op een boek, werd ik opgeattendeerd van een Engelse historicus genaamd Richard Overy, godzijdank weet ik deze naam wel, dat komt omdat ik al vrij veel van Richard Overy heb gelezen, en dit nieuwe boek van Richard Overy is eigenlijk in allerlei opzichten wel de belangrijkste historicus van de Tweede Wereldoorlog. Waarom? Omdat hij over de Tweede Wereldoorlog een hele reeks van meer dan voortreffelijke boeken heeft geschreven, die iedereen die geïnteresseerd is in de Tweede Wereldoorlog met vrucht kan lezen. Dit nieuwe boek van Richard Overy, dat heet Blood and Ruins, dat we zeggen bloed en ruines, maar het gaat eigenlijk over de Tweede Wereldoorlog als een Imperial War, dus de ondertitel is kun je eventueel over dat boek een bespreking schrijven, want je zult zien, als je het uitdreksel gemaakt hebt, zie je ineens beter wat de structuur en het centrale boodschap van het boek is. Wat je eerst nog misschien, nou, moet wel heel erg goed zijn, nog niet zo scherp in de gaten houden. Dus ik zou zeggen, en je moet ook over hetzelfde onderwerp meerdere boeken lezen. Eén boek is zelden voldoende. Maar stel voor, je wilt alles weten over de Koude Oorlog, dan kun je volgens mij met een boek of vijf, zes, dan ben je een heel eind. Als je weet wat daarin staat, ben je een heel eind. Dan hebben we ook wat reacties nog gekregen op de Jezus podcast. De Jezus podcast, dat klinkt ook wel vrij eigenaardig natuurlijk. We hadden het vorige keer over het geloven, daar kwam Jezus natuurlijk ook voorbij. Ik heb laatst geluisterd, zegt iemand, ik heb een onderzoek gelezen van Francesco Carotta.


The topic is defined by: 10_vakantie_hotel_park_ga

Representative minute of podcast:

Ik heb wel eens uit een telefoon gezegd, want als je ineens moet… Ik herinner mij, eerlijk gezegd, dat was nogal heel problematisch, een handige storm. Ja, je weet dat in onze herinnering, die storm die we nu hebben gehad, erger is het nooit geweest, maar die was een stuk erger. Kan ik je zeggen, dat was denk ik, nou, ik heb geen idee, 25 jaar geleden of zo. En ik kwam met de trein uit Rotterdam. En nou ja, ik durfde eigenlijk niet naar huis te gaan, want dan moest je lopen en het busverkeer was gestopt, de taxis reden niet enzovoort. Ik ben ten slotte over zijn gaan lopen en heb bijna nog een hele grote bomen op m’n hoofd. Nou ja, bijna, joh. Beetje sprookjes, je moet die dingen een beetje opzieren. Merk maar wel, mijn vrouw bijna om te zeggen dat ik nog leefde, want de trein had langdurig stilgestaan ergens. Nou ja, ik ga me zeggen, ter hoogte van Bodegraaf of zoiets dergelijks. mijn zoon had een CO2-metertje bij zich om te kijken of de luchtkwaliteit nog een beetje redelijk was. En dat is allemaal goed gegaan? Ja, tot op heden, je ziet het, we zitten hier vrij normaal te praten, ik ben 24 oktober jarig. Als we corona hadden opgelopen, dan had ik hier niet gezeten, denk ik. Als je in dat park rondloopt, dat doe je volgens mij iedere dag een paar keer, elke dag, maar dat is voor jou dus geen regreatie, dat is meer ontspanning, toch? Als je daar rondloopt. Ja, ik hou van wandelen. Oké, maar dat kun je ook… Tegenwoordig zegt ook zelfs de minister van Volksgezondheid dat je regelmatig moet wandelen, dus daar houd ik me aan. En ik kan in het park vrij complexe verschillende routes lopen, het is niet zo dat je alleen maar één route kunt lopen, variatie is mogelijk, maar ik loop niet alleen in het park, ik begin vaak in het park en dan maak ik een wandeling in de omgeving en daar zijn in Utrecht en Oosten meer of meer onbeperkte mogelijkheden om een vrij aardige stadswandeling te maken. …want dan is het wat minder druk bij de boot, hoop ik. Vrijdag is het dan altijd weer druk. Omdat al die huisjes en zo die wisselen op de vrijdag en zaterdagen. En nou ja, we zijn nu zeer tevreden met het weer. Het is nu typisch Hollands zomerweer. Er staat hier een briesje. Een fors briesje, maar toch wel een prettig briesje. De lucht is blauw. Hij zei her en der witte wortjes. Het is niet te warm. Wat is dat een onbeschrijflijke zegen. Het was de eerste dagen natuurlijk veel te warm. Ook hier binnen in dat huisje was het steeds 29 graden of zo, 30 graden. Heel onwaar gedaan. Het is een raadsel waarom mensen sowieso naar nog warmere streken vertrekken. Niet waar als je denkt dat de warmte hier al betrekkelijk onwaar gedaan is. Maar goed, dus wat betreft het… …tevredenheid is wat betreft het weer groot. We zitten ook op een rustig deel van Texel.


The topic is defined by: 11_programma_tv_televisie_talkshow

Representative minute of podcast:

Wil je over het feit dat ze op één gedurende 30 seconden door elkaar heen gelult hebben? Als je dat als onderwerp gaat zitten, bespreken, jonge jonge, wat een armoe. Dat doen ze wel vaker. Als er iets opvalt, dan kijken meer mensen naar die talkshow. Vaker een miljoen kijkers hebben ze. Nou, dat zal niet zo heel lang duren, denk ik. Hun kijkcijfers waren niet geweldig voordat ze aan deze show begonnen. Ja, maar toen ging het alleen over voetbal. Zou dat ook een oorzaak zijn? Ze hebben het nu over van alles en nog wat. Nou, ik zal zien dat dat gaat zakken. Mijn indruk is dat ze zijn een veel te veel talkshow. Ze geloven van wel niet uit te rekenen dat er nu 42 talkshow’s zijn. Het is wel wat anders. Ze kunnen hier, ze lachen hier veel. Ze lachen, daar ben ik er sowieso al tegen. Oké, maar daar zit wel zelfspot in. Zo aan de tv lachen. Maar Op1 is vrij serieus altijd. En dan kunnen ze niet echt, ze maken nooit grapjes. Ja, de sfeer bij Op1 is, denk ik, met wat publiek erbij zou die beter zijn. schijnbaar volkomen opbenullige dingen om te zetten in televisieprogramma’s. Die een enorme kijkdichtheid hebben. Echt dat je denkt, hoe is dat mogelijk? Dat is niet zo moeilijk. We zijn er bijna. Ik bedoel, hoeveel zufferen dan dat programma kun je niet krijgen. Er kijken wel een miljoen mensen naar of anderhalf miljoen. Dus ik ben een bewonderaar van de programmeerintelligentie van Omroep Max. Maar jammer genoeg is het voor een kijkersmarkt waar ik absoluut niet bij hoor. Zo moeilijk is het toch niet, maar er zijn allemaal oude mensen die naar de NPO kijken. Ik ben ook enorm oud, maar heb ik niet al vaker gezegd… heb ik niet die Stephen Fry geciteerd? Making TV is great, looking at TV is terrible. Nee, dat kan ik me niet herinneren. Oh, wat een leuk citaat. Iemand zei dat tegen mij. Ben vergeten wie. Maar de slimste mens is ook een hit omdat er heel veel bejaarden naar kijken. Ja, het juicht van harte toe als die mensen daar een nuttige avond mee hebben. De slimste mensen worden in totaal door een man of vijf te gemaakt. Dat is veel. Nee, maar je moet rekenen met de regie. De regie daar zitten al vier, vijf mensen. Dan is er geluidsafdeling, er zijn vijf camera’s. Visagie? Visagie. Het is een omvangrijk bedrijf. En dan nog de redactie natuurlijk. Dan heb je een hele omvangrijke redactie die ook keihard werkt terwijl het programma draait, want die moet allerlei dingen razendsnel beslissen. Dus ja, ik geloof, we hebben al zo’n groepsfoto gemaakt. En er waren in totaal vijftig mensen er zo bij betrokken. Ja, dat is veel. Maar goed, voor zo’n succesvol programma. Dus ja, de makers, dat wordt allemaal heel makkelijk toegerekend aan degene die in beeld komen, maar voordat er een beeld van een meneer Janssen of Pietersen is, of mevrouw Janssen of Pietersen, is deze hele wereld die moet draaien, die moet het goed doen. Ja, dat geloof ik graag. Ja, Frans Klein, dus ik denk dat die gaat bepalen of de verhorsums doorgaan.


The topic is defined by: 12_inflatie_financiële_economen_overheid

Representative minute of podcast:

Precies, dus cruciaal… voor die ontwikkeling. Ja, maar er was ook in het politbureau vaak… waren er tegenkrachten… die zeiden, het moet niet te snel… want als het te snel gaat… dan kan die economie… die kan oververhit raken… dat kan inflatorenprocessen veroorzaken… want ook in de jaren 80… het geval is geweest… en er zijn ook wel momenten geweest… bijvoorbeeld in 89… dat het afgeremd is… maar dan zie je toch heel snel… dat die fabuleuze groei… die jarenlang 12,5% per jaar was… dat die weer terugkeert. Maar ze zijn wel degelijk… in het politbureau bekommend geweest… want het kan ook te hard gaan. Het gaat geweldig… maar het kan ook te hard gaan. Dat nestelijke aspect… Ja, en degene die dat… ik ben nu even de Chinese naam vergeten… van de man die dan tegen Deng zegt… maar een beetje… die had ook aanzienlijke macht binnen het politbureau. Nogmaals, er was zeker collegialiteit… …perfect verspreid door de hele samenleving. Wel, nu, dat bleek ook in het daadwerkelijk het geval te zijn… …de risico’s bleken perfect verspreid te zijn door de hele samenleving. Want er ontstond naast die rare beleggingsinstrumenten… …ontstond ook een huizenmarkt die volledig van de kook raakte… …of die zei, aan de kook raakte… …dat heeft geleid tot een, nou ja, wonderlijke… …dat je in Amerika kon je ook geld lenen… …als je eigenlijk helemaal geen onderpant had… …en dan begon je met een lage rente… …en dan stond er in een kleine lettertje… …na drie jaar veel hogere rente moest betaald. Maar ja, al die leningen die vaak volledig onbetrouwbaar waren… …die konden meteen doorverkocht worden… …niet waard door degene die ze gesloten hadden… …dus die hadden er verder ook niet zo verschrikkelijk veel last van. En bovenin ontwikkelde zich ook nog een hele industrie… …waarbij je die dingen kon verzekeren. Met swaps, ja, ik ga dat niet allemaal uitleggen… …ik heb ook moeite moeten doen om het allemaal te begrijpen… …hoe idioot het wel niet was. Want dat kan gransaliger resultaten hebben. Omdat heel veel mensen helemaal niet meer gewend zijn aan het betalen van rente. Over bijvoorbeeld leningen. En allerlei leningen hebben uitstaan misschien. Die bij een snel verhogende rentestand niet meer betaalbaar zijn. Dus ja, we zitten in een soort wonderlijke knijp. Hoe moet je dat zeggen? In een paradoxale situatie. Waarin we graag de inflatie willen afremmen. Maar wel erg op moeten passen dat we niet… Je weet dat je niet te hard op de rem gaat staan. Als je altijd in een schakelauto hebt gereden. Je rijdt voor het eerst in een automaat. Dan rem je met je rechtervoet op waarmee je normaal gas geeft. Of nee, je remt met je linkervoet, zo is het moet zijn. Waarmee je normaal in één klap de koppeling intrapt. En dat doe je dan ook bij het rempedaal.


The topic is defined by: 13_telescoop_aarde_maan_mars

Representative minute of podcast:

Maar ja, je begrijpt, er was natuurlijk een instelling die van mening was… …dat het algemeen bekend was en dat de heren dat ook zelf had geschreven en gezegd… …dat de zon om de aarde draaide en dat was natuurlijk de kerk. Dus Galileo heeft later ook allerlei glazen met de kerk gekregen. Want Galileo richtte zijn kijkertje op de hemelen. En wat zag hij? En dat sprak mij enorm aan, eerlijk gezegd, later pas. Ik zag eigenlijk met mijn eigen kijkertje, wat ik toen op 14-jarige leeftijd had gekocht… …dat was eigenlijk nog een vrij kostbaar instrument. Ook een typische Hollandse kijker in de zin dat het een objectief was. Namelijk een 9 centimeter objectief, 90 millimeter objectief. Drie oculaire zaten erbij, daar zat de mogelijkheid bij om naar de zon te kijken. Dus een verduisterd oculaire, om het maar even zo te zeggen… …zodat je ook de zonnevlekken kon zien. En eigenlijk zag ik door mijn kijkertje, ooit wist ik dat op dat moment niet… Hij begreep direct de mogelijkheden van die kijker. Hij heeft die kijker ook nog verbeterd. Zodat de vergroting verbeterde en de kwaliteit van de lenzen beter werd. En vervolgens heeft hij dat ding op de hemelen gericht. En daarmee in feite een blijvende revolutie veroorzaakt in onze denkbeelden… …over hoe de hemelen eigenlijk in elkaar staken. Want er was toen al een grote discussie over de vraag… …staat de aarde in het centrum van het universum en draait de zon om de aarde heen? Of is het precies zo omgekeerd en draait de aarde eigenlijk om de zon? Wat Copernicus had al gezegd, ja, dat idee natuurlijk dat de zon om de aarde draait… …dat levert zulke wonderlijke conclusies op. En de waarnemingen die wijzen zozeer in de omgekeerde richting. Namelijk dat de aarde om de zon draait. Om dat ding te bouwen. En ten slotte na eindeloos uitstel is die dan afgelopen december is die gelanceerd. En dat heeft in totaal zo’n 10 miljard gekost. Het hele ding plus het onderhoud in de komende 10 jaar. Dat gaat ongeveer 10 miljard kosten. Dan zullen mensen zeggen zonder van dat geld 10 miljard. Dat is eigenlijk fantastisch weinig voor wat dat ding kan. Naar mijn idee. Het is een zegenrijke manier om geld te besteden. Boondien is het een interessant samenwerkingsproject. Want het is de daanzaamheid. Het is ook die Europese Space Agency die doet er ook aan mee. En de Canadian Space Agency doet er ook aan mee. Maar dit alles over de Webb Telescoop. Dat kunnen mensen allemaal nog fijn in de krant lezen. Maar ik dacht is het niet aardig om iets te zeggen over de geschiedenis van het telescoop. En omdat jij dacht dat een telescoop ook gebruikt kan worden om bacteriën te bestuderen. Ja ik was even in de war met de microscoop.


The topic is defined by: 14_boeren_trekkers_agrarische_landbouw

Representative minute of podcast:

die belangenbaartigers van de van de landbouw… Nou ja, die landbouwers in de brede zin van het woord in dit geval hebben natuurlijk meteen onderling herrie gekregen, want ik begreep dat sommigen meenden dat je helemaal niet mocht spreken met de overheid en dat het LTO dat toen doorbroken heeft. Dat heet niet van dat tak of zo. Dat zou kunnen. Zoiets dergelijks in ieder geval. Maar ja, die is door de minister-president gebeld, want die ken ik nog wel vrij deftig vond en ja, die is toch bereid om aan tafel te gaan zitten. Wat ik van harte toejuich, aangezien ik van men ik ben, dat ooit zal er serieus gesproken moeten worden over deze kwestie en ooit zal er tot een besluit moeten worden gekomen waarbij een deel van onze veestapel weggesaneerd moet worden. Omdat die inderdaad buitenproportioneel gegroeid is. Ja, LTO gaat echt een vrij blijvend gesprek met Remkes hebben en dat was een andere club en die ging met ze bellen, heb ik begrepen, Ik zou zeggen, Farmers Defence Force, doe het vooral, maak u vooral zo impopulair mogelijk. Ik begreep ook dat de minister weer met de dood bedreigd was, kortom. Het zijn weer de bekende toneeltjes van intimidatie, bedreiging met de dood, het doen van dingen die gewoon verboden zijn voor normale mensen. Maar die ook verboden zijn voor boeren, sorry. Er was een vrachtwagen, daar stond Pim Fortuyn op met zijn sterfdag. Ja, ik heb het gezien, het plaatje heb ik gezien. En inderdaad die minister en daar stonden puntjes en dergelijke. Wat een misselijk gedoe, ze heeft terecht een klacht ingediend. Er zal ook al weer niks mee gebeuren, denk ik. Je hebt de indruk dat ook daar het kabinet een beetje lullig beschroomd in de hoek staat. Zij zegt, jongens, laten we nou een tijdje de andere kant op kijken, misschien gaat het gewoon vanzelf over. Misschien kunnen we ook de AA-auto’s ook allemaal afplakken, alle nummerborden afplakken. Is dat niet een idee, dat we uit solidariteit alle Nederlandse nummerborden afplakken? Ik ben graag bereikt om het te doen. Ja, ik heb dat wel een beetje gevolgd. En je begrijpt wat ik daarover denk. Daar was, begreep ik, constructief gesproken. Althans, dat vond Remkes. Dat vonden de boeren niet. Die natuurlijk in toenemende mate aan koersen op een soort ultimative opstelling. Je moet allemaal doen wat wij zeggen, anders gaan we weer demonstreren op grote schaal. Het wordt dan nog erger dan het al was. Ja, dat is een beetje een raar standpunt natuurlijk. Ik begreep dat ook andere onderdelen van andere groepen die aan het overleg deel hadden genomen, eigenlijk nog boos waren dat die boeren meteen hadden gezegd, nee, dit is allemaal zulke slapgelul. Wij slaan de deur dicht en we gaan in de hoogste versnelling weer protesteren. Ik zou zeggen, ga praten, blijf praten. Er waren wat wisselende geluiden. Er waren mensen die zaten erbij in Utrecht in het provinciehuis en die zeiden, het was best wel positief. Jazeker. En die waren geschokt dat de boeren dus bij eindigen van de gesprekken hadden gezegd,


The topic is defined by: 15_minister_kabinet_president_wilders

Representative minute of podcast:

Zelfs de verantwoording van het ministerie van Financiën deelde niet de financiële verantwoording. Dus dat zou ik bepaald niet willen zeggen. Wie vind je wel een goed bestuurder dan? Ik had de indruk dat Colmees een prima bestuurder was omdat hij wist wat hij erover had. Omdat hij ook op allerlei topfuncties in het ministerie van Financiën heeft gewerkt. Maar nogmaals, vaak hoor je pas achteraf of iemand een goede bestuurder was. Dat vraagt een soort soliditeit, rust, competentie. Je bent haast geneigd om te denken, wie was een goede bestuurder? De oude Willem Drees was een goede bestuurder. Daar zijn we het wel allemaal over eens geraakt historisch gesproken. En hoe deed hij het in die campagnes en die mediadingetjes? Nou, hij was eigenlijk in campagnes vaak radicaler dan je wel zou denken. Vergeet niet dat in het zuiden des lands werden de kabels van de microfoons doorgeknipt… door de katholieke jeugdbeweging. En waarom was dat? Nank Balkenende, die ik over zijn helemaal niet wil kleineren. Die heeft geleidelijk aan een beetje de reputatie van een stuntelaar gekregen. En hij heeft geluk gehad dat hij toen gewonnen heeft? Jazeker, en ik geloof ook dat hij toen een vrij onbekend Kamerlid was. En hij zei, wacht maar even, ik heb die verkiezingen gewonnen, dus ik laat me niet vervangen door een of andere CDA hotshot. En ik word de premier. En ja, voor zover je in Nederland überhaupt als premier geweldig kunt scoren. Balkenende is geen superpremier geweest, maar hij heeft het ook niet zo slecht gedaan als zijn reputatie wil, denk ik. Het is wel een voordeel als je aanvankelijk een matige reputatie hebt, dat het dan vaak wat beter wordt naarmate de historische blik erop gericht wordt. Denk aan Eisenhower, die we allemaal beschouwen als een randebiel, maar die uiteindelijk een heel redelijke president bleek te zijn. Als ik jou zo hoor, neem jij Melkert niks kwalijk? Maar dat neemt niet weg, we zullen het erover hebben, dat Drees toch een buitengewoon goede minister-president was. Dat was Lubbers denk ik ook, maar ja, die heeft ook een te bekende cardinale fout gemaakt dat hij te lang is blijven zitten. Hij had na tien jaar moeten vertrekken. Ik begin ook te vermoeden dat ook Rutte er verstandig aan had gedaan om na tien jaar te vertrekken. Nou dan blijven er nog een heleboel minister-presidenten over die in het algemeen een, laten we zeggen, minder glorieuze indruk hebben gemaakt. We kunnen het even nalopen, schermen, dat hebben waarschijnlijk de meeste mensen helemaal nooit van gehoord. Of mensen nog een beeld hebben bij Bill, dat acht ik uiterst twijfelachtig. Of mensen nog weten wie Marijne is, nou idem dito, buitengewoon twijfelachtig. Cals, die zouden mensen nog nog kunnen herinneren, een tragische figuur in allerlei opzichten. Dan krijgen we Piet de Jong, een man zonder franje, een man zonder van varen, vier jaar minister-president geweest.


The topic is defined by: 16_rijden_auto_rijdt_fiets

Representative minute of podcast:

En ik heb éénmaal, toen ging ik zelf niet over het huren van een chauffeur, dus dat was een mij onbekende jeugdige figuur gehuurd. Een jongen natuurlijk. Niet Enzo Knol? Nee, niet Enzo Knol. Daar zou ik überhaupt niet mee in de auto durven, moet ik eerlijk zeggen. Voordat je twee smeertieren zo’n godvergeten visstik aan. Dus dat zou ik absoluut niet willen. Nee, we zijn toen naar Brussel geweest, en ook de benen samen met Geert Mak. En die jongen die reed als een duivel. Het was verschrikkelijk gewoon. Het was voortdurende remmen en optrekken. Kennelijk vond hij het heerlijk om in een auto te rijden die inderdaad een vrij stevig vermogen heeft. Want ik was alleen al uitgeput van achterin zitten. Ja, dus ik heb al gezegd, dat nooit meer. Je moest toch met hem terug? Ja, ik moest ook nog terug, ja. Een echte goede chauffeur, dat is hartstikke lastig werk hoor. Exact, oké. Maar dat zijn dan vaak studenten die je inhuren? op de grote weg, die maar 80 km per uur rijdt, dus dat en misschien ook hele vieze uitlaatgassen uitbraakt. Je hebt hier dat klopje dat je toch in kunt drukken waardoor dat wel buiten blijft. Dat zou kunnen. Ik sprak van de week ook een vrachtwagenchauffeur en die zegt van als je bijvoorbeeld de trajectcontrole inrijdt, want zij mogen volgens mij 80 met zo’n vrachtwagen, hij vond het ook absurd dat een touringcar, die mag dan schijnbaar wel 100 km per uur rijden, hij zegt dat snap ik niet. En die kentekens worden herkend, dus als hij als vrachtwagen er voorbij rijdt, dan ziet dat apparaatje, dit is een vrachtwagen, dus 80 is de max. Dus dat is wel interessant, dan wist ik niet dat dat verschil wordt gemaakt. Ja, hij kan het toch gewoon op cruisecontrol zetten, dan zullen ze die vrachtauto’s ook wel hebben. Dus dan is de kans ook, want je weet dat, tenminste dat is voor mij zo, zet ik hem niet op cruisecontrol, dan ga ik of net iets harder rijden, of zachter, of ik zak tot 90 of zo, dus het kost mij moeite om precies op die 100 te blijven hangen, dus je zet hem op cruisecontrol, wordt wel erg losjes gebruikt, Trump is een fascist, nou, nou, nou, een piep klein autootje probeert hier de geluidsbarrière te doorbreken in een rustige straat, moet hij natuurlijk weer vol op te remmen aan het eind van de straat, wat een energieverspilling, je denkt ook wel eens het zijn juist die kleine autootjes, alleen om te bewijzen dat ze ook met zo’n gemotoriseerde vloot tot iets in staat zijn, zetten ze even flink wat gas, ja, dus je moet oppassen met het losse rondstrooien dat iedereen maar een fascist is, ik had al eens een discussie met studenten, zei, wat is dan volgens jullie een fascist, ik zei ook wel je moet er voorzichtig mee zijn, het is een historisch verschijnsel, het is gekoppeld aan een specifieke moment in de Europese geschiedenis, en toen zei er een van die studenten, dit was wel al begin


The topic is defined by: 17_duitsland_ddr_duitsers_duitse

Representative minute of podcast:

het verreweg het meest succesvolle industriële land in Europa geweest. Want pas in 1913 wordt Engeland als industriële mogendheid gepasseerd door Duitsland. Ook natuurlijk een heel frustrerende zaak, op anderhalve eeuw heb je de lakens uitgedeeld en je was de beste en zo. En dan ineens komt er een nieuwe natie op die het beter kan dan jij. Tot op de dag van vandaag is dat ook zo gebleven. Duitsland is natuurlijk een echt sportwonder in allerlei opzichten. Dat kun je bepaald van Engeland niet zeggen. Ondertussen was natuurlijk heel Europa wel gepasseerd door de Verenigde Staten, die eigenlijk vanaf pak en beet 1890 al een economie hadden die groter was dan die van de Duitsers, de Fransen en Engelsen, samengenomen. Maar goed, niemand lette toen nog op de Verenigde Staten, dus Engeland was een speciaal geval. gewoon twee staten, Bambons, Republiek Duitsland en DDR, die toch één natie waren. Als we nou iets gemerkt hebben na 89, dat het ook toch wel een beetje twee naties waren geworden. En dat de restanten daarvan in feite nog steeds aanwezig zijn. Daar komt het natuurlijk bij dat uit de DDR op grote schaal de hogescholen vertrokken. Naar het westen, hogescholen en de knappe vrouwen. Daar zijn ze er altijd bij. Maar daar hebben we het volgens mij allemaal al bij. Dat heb je vaak gezegd. Uitgebreid overal. Dat is de geschiedenis van de Trabant. Een icoon wel, hè? De Trabant is een icoon. Je hebt ook Trabantclubs. Dat moet voor mensen die masochisten zijn en zelfkwellers. Daar gaat mijn telefoon. Ja. Het is wel een plaag, die telefoon. Ja. Ik dacht dat ik hem dus had uitgegeven. Het is voor de luisteraars wel leuk om te weten dat wij voortdurend gebeld worden. Tja. Ik zeg van zo. nieuwe infrastructuur, idem dieto telefonische infrastructuur, het heeft enorm veel gekost, ik dacht dat Duitsers hebben toen een 10% toeslag op de inkomstenbelasting moeten betalen vanaf de herenigingen, bij mijn weten betalen ze dat nog steeds en voor een belangrijk gedeelte natuurlijk zijn bijvoorbeeld sociale uitkeringen en vergelijkbare zaken die zijn 1 op 1 overgegaan van west naar oost, wat ooit de oostelijke Duitsers er niet van weerhouden heeft om voortdurend over alles maar ook alles te klaar, steen en been te klaar, ja wat zullen we daar wel zeggen, ze moeten blij zijn dat ze in feite toch in een relatief comfortabele situatie terug zijn gekomen, ik weet niet of ik die anekdote al eens verteld heb, waar opnames aan het maken waren in Berlijn, met die man, ja dat heb ik al verteld, ja dat schrapeerde mij ontzettend, ze zijn allemaal boos, ze doen een beetje denken aan Nederlanders die


The topic is defined by: 18_voetballen_voetbal_sport_formule

Representative minute of podcast:

Nee, er was helemaal geen scheidsrechter. Dat was ook helemaal niet nodig, we hadden drie corners en een penalty. Prima systeem. Ja, dat stelde allemaal niks voor, we kenden de spelregels ook niet precies. Je had ook picketjesloerder, omdat als je de buitenspelval niet gebruikt, omdat je niet weet hoe die werkt… Dan kun je iemand bij het vijandelijke doel zetten, dan geef je een hoge bal en die schopt hem erin. En dat heet picketjesloerder? Dat heet een picketjesloerder, ja. Oké, grappig, dat kende ik helemaal niet. Nee, tegenwoordig gaat iedereen naar een voetbalclub waar je in de hoogtuin de regels leert, maar daar hadden we geen sprake van. Die bal stelde ook niks voor, een echte leren bal was al een wereldwonder. Nog eventjes over Poetin. Nog eventjes over 1954, 1953, 1954 of zo. Oh ja. Maar Poetin heeft natuurlijk nu wel het havengebied helemaal in handen, Zuidkust, en hij kan natuurlijk nu ook bepalen… zesde is dood, hij is zijn hele leven zwaar aan de drugs geweest. En aan de vrouwen en noem het maar op. Ja, alles waar je aan kunt zijn. Ja, van vrouwen word je niet, in principe ga je niet meteen dood. Nee, dat ben ik helemaal met je eens, maar de drugs zijn vaak ruim voldoende om je toch relatief jong aan je eind te brengen. Maar het is natuurlijk een ontzettend groot sport, volkssport nummer één, en hij was het symbool van die sport. Nou, er zijn toch wel meer symbolen. Als ik nou toch een symbool van voetballer zou zeggen, neem dan bijvoorbeeld iemand die in de eredivisie een verdienstelijk partijtje ergens bij een middenmotor in de verdediging speelt, dat vind ik een symbolische figuur. Je hebt natuurlijk niks aan die luiden die van de Heere de Graaf hebben meegekregen om werkelijk groots te voetballen, waarbij, als ik het goed begrijp, te betrokken en ook regelmatig met de hand scoorde. Rijtsma was daarover inderdaad in een discussieprogramma, die reageerde daarop, hij heeft een van zijn bekendste doelpunten met de hand gescoord. Ja. Nou, als je dat in Nederland doet, dan word je de tent uitgelachen. Hoe heet dat dan? Wat is dat voor iets? Dan kies je dus de jongen of het meisje waarvan je denkt dat die het meest succesvol zal zijn in de samenleving. Waarom doen ze dat? Omdat ze altijd in dit soort van slappe, competitieve termen denken. En dan? Wij denken ook wel in competitieve termen, maar anders dan zij. Bij hen is het veel meer openlijk. Net zo goed als je bij ons bij het voetballen een paar van die meisjes zou hebben met die pom-poms. Dat al heel gauw ze zeggen, flikker op met die meisjes, ga voetballen. In plaats van die onzin. Het is lastig om het te zeggen, maar hij legt dat enorm leuk uit. Dat het vrijwel niet in kaart te brengen is wat er anders is. Vooral omdat je steeds denkt dat het eigenlijk hetzelfde is. Maar het is het niet. Het is niet hetzelfde. Ik zweer het je. Ik heb het ook aan mijn kinderen geprobeerd uit te leggen. En die hengen toen. Mijn dochter is twee maal langdurig in de rek. Tom-Jan Mees komt hier altijd voorbij.


The topic is defined by: 19_nederland_belgië_vlaanderen_inwoners

Representative minute of podcast:

Hij woonde in Hartje, Amsterdam. En dan verhuis je naar Tessel en dan word je alsnog getroffen door de toeristische tsunami. Hij heeft er dus wel last van, van die all inclusive… Ik geloof dat dat dan wel weer meevalt, maar het kan ook hier heel druk zijn, ook waar hij woont. Je hoort altijd van de Wadde-eilanden dat ook mensen die in Groningen in het ziekenhuis werken, een goede baan hebben. Dat die toch in de weekenden, ook in de herfst- en winterperiode, eventjes naar bijvoorbeeld Ameland gaan of naar Terschelling. Ja, dat kan natuurlijk. Als je in Den Helder woont, dan kun je zo overwippen in het Terschel. Dat is niet zo’n groot probleem. Maar Vuelta en zo, om daar nog even op terug te komen, dat hoeft wat jou betreft niet meer terug te keren. Want het gaat ook naar Den Bosch volgens mij. Het is op drie plekken in Nederland. Ik ben daar van die kant tegen. De Vuelta is een Spaanse wieleronde. Ik begrijp absoluut niet waarom die in Utrecht of in Kopenhagen of in Malmö zou moeten beginnen. Absoluut niet. verhalen, denk je dat dat hier in Nederland ook zou kunnen gebeuren? Nee, dat denk ik niet. Waarom niet? Ik weet niet of we voldoende ex-hofdames hebben om iets dergelijks op touw te zetten of anderhalve haren in de adelijke sfeer. Wie zou je, waar, wie zou je moeten, heb je iemanden betogen of zo? Nee, maar je weet natuurlijk niet wat er onder de raden allemaal speelt en broeit. En dat er iets broeit in Nederland, dat is natuurlijk een feit, dat zie je op verschillende plekken. Er zijn mensen heel ontevreden en misschien dat die zich… Nou ja, daar hebben we het vaak over gehad natuurlijk en dat is een algemeen bekend feit, ongeveer Maar even afgezien daarvan, ja, dat kan wel consequenties hebben voor de rest van de samenleving. Ik was ook, je had die vorige week zondag, die grote demonstratie in Amsterdam tegen de coronamaatregelen. Ja, ze zeggen zelf altijd dat er dan 100.000 mensen zijn, maar ik geloof dat het 15.000 of 25.000 waren, en totaal ook al betrekkelijk veel. Dat je voor zo’n volkomen geschift standpunt ook nog bereikt bent om naar Amsterdam te reizen, om je daar te laten besmetten op de Dam, is toch vrij curieus. Maar ik werd getroffen, een heel interessant theoretisch punt, door een groot bord, ik meen dat het rond werd gedragen door een bejaard echtpaar, en daar staat op, vrijheid die geconditioneerd is, is geen vrijheid. En dan denk je bij jezelf, wanneer zijn deze mensen opgehouden met nadenken? Dat moet ergens zijn geweest in het laatste jaar van de kleuterschool, ongeveer. Want drie, vierjarigen, zoals je weet, die denken dat alles kan, en dat als je enorm


6.3 The podcast really is an ‘actualiteiten’ podcast

In the description of the podcast we may read: ‘Maarten van Rossem en Tom Jessen geven hun kijk op het nieuws en de actualiteit.’, which translates to: ‘Maarten van Rossem and Tom Jessen share their point of view on the news and current affairs.’. With our current techniques, we can easily check if this is true. We already saw some proof of this in Figure 11, but with our current topic model we can go a lot further. We can plot our top 12 topics over time, and check their relative frequencies. If this really is a current affairs podcast, we should be able to see some clear patterns over time.

Show the code
def topics_over_time_weeks(
    topic_model,
    docs: List[str],
    timestamps: Union[List[str], List[int]],
    binsize: int = None,
    datetime_format: str = None,
    evolution_tuning: bool = True,
    global_tuning: bool = True,
):
    """
    Create topics over time, aggregated to the bi-weekly level.

    (Please note, this function is a direct adaptation of the sourcecode of BERTopic)
    To create the topics over time, BERTopic needs to be already fitted once.
    From the fitted models, the c-TF-IDF representations are calculate at
    each timestamp t. Then, the c-TF-IDF representations at timestamp t are
    averaged with the global c-TF-IDF representations in order to fine-tune the
    local representations.
    NOTE:
        Make sure to use a limited number of unique timestamps (<100) as the
        c-TF-IDF representation will be calculated at each single unique timestamp.
        Having a large number of unique timestamps can take some time to be calculated.
        Moreover, there aren't many use-cased where you would like to see the difference
        in topic representations over more than 100 different timestamps.
    Arguments:
        docs: The documents you used when calling either `fit` or `fit_transform`
        timestamps: The timestamp of each document. This can be either a list of strings or ints.
                    If it is a list of strings, then the datetime format will be automatically
                    inferred. If it is a list of ints, then the documents will be ordered by
                    ascending order.
        binsize:    The binsize you want to create for the timestamps.
                    The binsize is given in number of weeks, the default is 2.
        datetime_format: The datetime format of the timestamps if they are strings, eg “%d/%m/%Y”.
                         Set this to None if you want to have it automatically detect the format.
                         See strftime documentation for more information on choices:
                         https://docs.python.org/3/library/datetime.html#strftime-and-strptime-behavior.
        evolution_tuning: Fine-tune each topic representation at timestamp *t* by averaging its
                          c-TF-IDF matrix with the c-TF-IDF matrix at timestamp *t-1*. This creates
                          evolutionary topic representations.
        global_tuning: Fine-tune each topic representation at timestamp *t* by averaging its c-TF-IDF matrix
                   with the global c-TF-IDF matrix. Turn this off if you want to prevent words in
                   topic representations that could not be found in the documents at timestamp *t*.
    Returns:
        topics_over_time: A dataframe that contains the topic, words, and frequency of topic
                          at timestamp *t*.
    """
    documents = pd.DataFrame(
        {"Document": docs, "Topic": topic_model.topics_, "Timestamps": timestamps}
    )
    global_c_tf_idf = normalize(topic_model.c_tf_idf_, axis=1, norm="l1", copy=False)

    all_topics = sorted(list(documents.Topic.unique()))
    all_topics_indices = {topic: index for index, topic in enumerate(all_topics)}

    if isinstance(timestamps[0], str):
        infer_datetime_format = True if not datetime_format else False
        documents["Timestamps"] = pd.to_datetime(
            documents["Timestamps"],
            infer_datetime_format=infer_datetime_format,
            format=datetime_format,
        )

    # extract years from timestamps
    years = np.unique(data.date.dt.strftime("%Y").astype(int))
    end_year = pd.to_datetime(f"{years[-1]+1}-01-01")
    # Get timestamps for every week of the year
    bin_edges = []
    for year in years:
        for week in range(1, 55, binsize):
            date = f"{year}-{week}-1"
            date = pd.to_datetime(date, format="%Y-%W-%w")
            bin_edges.append(date)
    bin_edges = pd.DataFrame(bin_edges, columns=["bin_edges"])

    # remove year overflow at the end
#    bin_edges = bin_edges[bin_edges.bin_edges < end_year]
    # remove year overflow inbetween
    bin_edges = bin_edges.drop_duplicates()

    # bin the timestamps
    documents["Bins"] = pd.cut(documents.Timestamps, bins=bin_edges.bin_edges.values)
    documents["Timestamps"] = documents.apply(lambda row: row.Bins.left, 1)

    # Sort documents in chronological order
    documents = documents.sort_values("Timestamps")
    timestamps = documents.Timestamps.unique()
    if len(timestamps) > 200:
        warnings.warn(
            f"There are more than 200 unique timestamps (i.e., {len(timestamps)}) "
            "which significantly slows down the application. Consider setting `nr_bins` "
            "to a value lower than 100 to speed up calculation. "
        )

    # For each unique timestamp, create topic representations
    topics_over_time = []
    for index, timestamp in tqdm(
        enumerate(timestamps), disable=not topic_model.verbose
    ):

        # Calculate c-TF-IDF representation for a specific timestamp
        selection = documents.loc[documents.Timestamps == timestamp, :]
        documents_per_topic = selection.groupby(["Topic"], as_index=False).agg(
            {"Document": " ".join, "Timestamps": "count"}
        )
        c_tf_idf, words = topic_model._c_tf_idf(documents_per_topic, fit=False)

        if global_tuning or evolution_tuning:
            c_tf_idf = normalize(c_tf_idf, axis=1, norm="l1", copy=False)

        # Fine-tune the c-TF-IDF matrix at timestamp t by averaging it with the c-TF-IDF
        # matrix at timestamp t-1
        if evolution_tuning and index != 0:
            current_topics = sorted(list(documents_per_topic.Topic.values))
            overlapping_topics = sorted(
                list(set(previous_topics).intersection(set(current_topics)))
            )

            current_overlap_idx = [
                current_topics.index(topic) for topic in overlapping_topics
            ]
            previous_overlap_idx = [
                previous_topics.index(topic) for topic in overlapping_topics
            ]

            c_tf_idf.tolil()[current_overlap_idx] = (
                (
                    c_tf_idf[current_overlap_idx]
                    + previous_c_tf_idf[previous_overlap_idx]
                )
                / 2.0
            ).tolil()

        # Fine-tune the timestamp c-TF-IDF representation based on the global c-TF-IDF representation
        # by simply taking the average of the two
        if global_tuning:
            selected_topics = [
                all_topics_indices[topic] for topic in documents_per_topic.Topic.values
            ]
            c_tf_idf = (global_c_tf_idf[selected_topics] + c_tf_idf) / 2.0

        # Extract the words per topic
        labels = sorted(list(documents_per_topic.Topic.unique()))
        words_per_topic = topic_model._extract_words_per_topic(words, c_tf_idf, labels)
        topic_frequency = pd.Series(
            documents_per_topic.Timestamps.values, index=documents_per_topic.Topic
        ).to_dict()

        # Fill dataframe with results
        topics_at_timestamp = [
            (
                topic,
                ", ".join([words[0] for words in values][:5]),
                topic_frequency[topic],
                timestamp,
            )
            for topic, values in words_per_topic.items()
        ]
        topics_over_time.extend(topics_at_timestamp)

        if evolution_tuning:
            previous_topics = sorted(list(documents_per_topic.Topic.values))
            previous_c_tf_idf = c_tf_idf.copy()

    return pd.DataFrame(
        topics_over_time, columns=["Topic", "Words", "Frequency", "Timestamp"]
    )


def stacked_area_chart_topics(
    topic_model,
    topics_over_time: pd.DataFrame,
    top_n_topics: int = 10,
    topics: List[int] = None,
    custom_labels: bool = False,
    width: int = figsize[0],
    height: int = figsize[1],
):
    """
    Visualize topics over time, normalized per timestep

    (Please note, this function is a direct adaptation of the sourcecode of BERTopic)
    Arguments:
        topic_model: A fitted BERTopic instance.
        topics_over_time: The topics you would like to be visualized with the
                          corresponding topic representation
        top_n_topics: To visualize the most frequent topics instead of all
        topics: Select which topics you would like to be visualized
        custom_labels: Whether to use custom topic labels that were defined using
                       `topic_model.set_topic_labels`.
        width: The width of the figure.
        height: The height of the figure.
    Returns:
        A plotly.graph_objects.Figure including all traces
    """
    colors = plt.cm.tab20(np.linspace(0, 1, 20))
    colors = [rgb2hex(color) for color in colors]
    # Select topics based on top_n and topics args
    freq_df = topic_model.get_topic_freq()
    freq_df = freq_df.loc[freq_df.Topic != -1, :]
    if topics is not None:
        selected_topics = list(topics)
    elif top_n_topics is not None:
        selected_topics = sorted(freq_df.Topic.to_list()[:top_n_topics])
    else:
        selected_topics = sorted(freq_df.Topic.to_list())

    # Prepare data
    if topic_model.custom_labels_ is not None and custom_labels:
        topic_names = {
            key: topic_model.custom_labels_[key + topic_model._outliers]
            for key, _ in topic_model.topic_labels_.items()
        }
    else:
        topic_names = {
            key: value[:40] + "..." if len(value) > 40 else value
            for key, value in topic_model.topic_labels_.items()
        }
    topics_over_time["Name"] = topics_over_time.Topic.map(topic_names)
    data = topics_over_time.loc[
        topics_over_time.Topic.isin(selected_topics), :
    ].sort_values(["Topic", "Timestamp"], ascending=False)

    # Add traces
    fig = go.Figure()
    for index, topic in enumerate(data.Topic.unique()):
        trace_data = data.loc[data.Topic == topic, :]
        topic_name = trace_data.Name.values[0]
        words = trace_data.Words.values
        y = trace_data.Frequency
        if index == 0:
            fig.add_trace(
                go.Scatter(
                    x=trace_data.Timestamp,
                    y=y,
                    mode="lines",
                    line={"color": colors[index]},
                    hoverinfo="text",
                    name=topic_name,
                    stackgroup="one",
                    groupnorm="percent",
                    hovertext=[
                        f"<b>Topic {topic}</b><br>Words: {word}" for word in words
                    ],
                )
            )
        else:
            fig.add_trace(
                go.Scatter(
                    x=trace_data.Timestamp,
                    y=y,
                    mode="lines",
                    line={"color": colors[index]},
                    hoverinfo="text",
                    name=topic_name,
                    stackgroup="one",
                    hovertext=[
                        f"<b>Topic {topic}</b><br>Words: {word}" for word in words
                    ],
                )
            )
    # Styling of the visualization
    fig.update_xaxes(showgrid=True, dtick="M1", tickformat="%Y-%b")
    fig.update_yaxes(showgrid=True, ticksuffix="%")
    fig.update_layout(
        yaxis_title="Normalized Frequency",
        yaxis_range=(0, 100),
        title={
            "text": f"<b>Topics over Time - Interval size of {binsize} weeks",
            "y": 0.93,
            "x": 0.40,
            "xanchor": "center",
            "yanchor": "top",
            "font": dict(size=25, color="Black"),
        },
        template="simple_white",
        width=width,
        height=height,
        hoverlabel=dict(bgcolor="white", font_size=16, font_family="Rockwell"),
        legend=dict(
            title="<b>Global Topic Representation",
        ),
    )
    return fig

binsize = 2
topics_over_time = topics_over_time_weeks(
    topic_model, docs, timestamps, binsize=binsize
)

fig_stacked_area_chart = stacked_area_chart_topics(topic_model, topics_over_time, top_n_topics=12)
fig_stacked_area_chart.show()

Figure 16: The top 12 most occuring topics of the podcast as visualized over time. We can see several big events in the data, such as the presidential elections in the USA in 2020, the invasion of Ukraine in 2022, and the farmers protests in the summer of 2022.

As we can see in Figure 16, many big events of the past years are visible in the topics covered in the podcast. We can identify the presidential elections of 2020, the invasion of Ukraine by Russia and the farmers protest of the summer of 2022. It is fair to say, yes, this really is a current affairs podcast.

Now I was about to end this analysis at this point. But I was listening to the latest episode of the podcast (#330), and something happened that I could not just leave be. Maarten and Tom mentioned that they were not sure which topics they had covered in the past, and they mentioned that somebodies stagair could work this out manually for them. No need for that, I can give you the information right now!

6.4 What topic is each episode about? (Please don’t let the stagair do this!)

Show the code
topic_names = {
    key: topic_model.custom_labels_[key + topic_model._outliers]
    for key, _ in topic_model.topic_labels_.items()
}

# Aggregate topic counts per episode
topics_per_episode = pd.DataFrame({"Titles": titles, "Topics": topic_model.topics_})
topics_per_episode["Episode"] = (
    topics_per_episode["Titles"].str.findall("(?:#)(\d+)").str[0].astype(int)
)

topics_per_episode = topics_per_episode[topics_per_episode.Topics != -1]
topics_per_episode["Topics"] = topics_per_episode.Topics.map(topic_names)
topics_per_episode = (
    topics_per_episode.groupby("Titles")
    .agg(lambda x: x.value_counts().index[0:3])
    .reset_index()
)

# Create final dataframe
topics_per_episode[["Topic 1", "Topic 2", "Topic 3"]] = pd.DataFrame(
    topics_per_episode["Topics"].to_list()
).iloc[:, :3]
topics_per_episode = (
    topics_per_episode.sort_values("Episode")
    .reset_index(drop=True)
    .drop(columns=["Topics", "Episode"])
)

topics_per_episode.iloc[:10].to_html(index=False)
Titles Topic 1 Topic 2 Topic 3
#1 - De terminale arrogantie van Wopke Hoekstra vvd,partij,cda gevaccineerd,vaccineren,vaccin minister,kabinet,president
#2 - Heerlijk! Een zomer zonder festivals gevaccineerd,vaccineren,vaccin geld,pensioen,banken beren,stofwisseling,bellen
#3 - Je moet strakke dames van middelbare leeftijd hebben theater,publiek,uur trein,spoor,station gevaccineerd,vaccineren,vaccin
#4 - Maarten van Rossem drinkt elke nacht bier trump,republikeinen,biden boek,lezen,boeken vrouw,kaag,joke
#5 - Hoe HOGER de belastingen, hoe GELUKKIGER de mensen belasting,betalen,overheid twitter,media,facebook roken,sigaretten,sigaret
#6 - Dansende Banaan twitter,media,facebook trump,republikeinen,biden gevaccineerd,vaccineren,vaccin
#7 - Hoorcollege Maarten van Rossem: Wint de verliezer wéér de verkiezingen in de VS? trump,republikeinen,biden stad,utrecht,amsterdam vvd,partij,cda
#8 - Ajuu trump,republikeinen,biden vvd,partij,cda onderwijs,school,geschiedenis
#9 - Is Maarten een kaviaarsocialist? trump,republikeinen,biden oekraïne,rusland,poetin rutte,kabinet,motie
#10 - Dagboek trump,republikeinen,biden merkel,duitsland,bondskanselier duitsland,ddr,duitsers

I just printed the result for the 10 first episodes, but you can click the tab below for an overview for the whole podcast.

Titles Topic 1 Topic 2 Topic 3
#1 - De terminale arrogantie van Wopke Hoekstra vvd,partij,cda gevaccineerd,vaccineren,vaccin minister,kabinet,president
#2 - Heerlijk! Een zomer zonder festivals gevaccineerd,vaccineren,vaccin geld,pensioen,banken beren,stofwisseling,bellen
#3 - Je moet strakke dames van middelbare leeftijd hebben theater,publiek,uur trein,spoor,station gevaccineerd,vaccineren,vaccin
#4 - Maarten van Rossem drinkt elke nacht bier trump,republikeinen,biden boek,lezen,boeken vrouw,kaag,joke
#5 - Hoe HOGER de belastingen, hoe GELUKKIGER de mensen belasting,betalen,overheid twitter,media,facebook roken,sigaretten,sigaret
#6 - Dansende Banaan twitter,media,facebook trump,republikeinen,biden gevaccineerd,vaccineren,vaccin
#7 - Hoorcollege Maarten van Rossem: Wint de verliezer wéér de verkiezingen in de VS? trump,republikeinen,biden stad,utrecht,amsterdam vvd,partij,cda
#8 - Ajuu trump,republikeinen,biden vvd,partij,cda onderwijs,school,geschiedenis
#9 - Is Maarten een kaviaarsocialist? trump,republikeinen,biden oekraïne,rusland,poetin rutte,kabinet,motie
#10 - Dagboek trump,republikeinen,biden merkel,duitsland,bondskanselier duitsland,ddr,duitsers
#11 - Wie Is Akwasi? zwarte,slavernij,zuidelijke nederland,belgië,vlaanderen kinderen,ouders,jongetjes
#12 - Maarten wil vaccin in elke bil gevaccineerd,vaccineren,vaccin trump,republikeinen,biden dood,leven,roman
#13 - Maarten rent voor zijn leven vakantie,hotel,park vvd,partij,cda baudet,thierry,wilders
#14 - Bevel is bevel auto,ford,motor onderwijs,school,geschiedenis boek,lezen,boeken
#15 - Wopke energie,planeet,fossiele minister,kabinet,president vvd,partij,cda
#16 - Te laat gevaccineerd,vaccineren,vaccin belasting,betalen,overheid vvd,partij,cda
#17 - Evert eten,eet,vlees uur,douchegordijn,balletjes vvd,partij,cda
#18 - Onderbroek programma,tv,televisie china,taiwan,chinezen trein,spoor,station
#19 - Rolmodel gevaccineerd,vaccineren,vaccin china,taiwan,chinezen telescoop,aarde,maan
#20 - Trump's Podcast Palace trump,republikeinen,biden zwarte,slavernij,zuidelijke kabinet,transparantie,parlement
#21 - Zelfredzaamheid vvd,partij,cda vliegen,vliegtuig,piloot minister,kabinet,president
#22 - De Slimste stad,utrecht,amsterdam onderwijs,school,geschiedenis muziek,radio,klassieke
#23 - Vroege dood gevaccineerd,vaccineren,vaccin dood,leven,roman geld,pensioen,banken
#24 - Kinderen postzegels,postzegel,verzamelen trump,republikeinen,biden baby,bevolking,mannen
#25 - Seks met zwarte slavin gevaccineerd,vaccineren,vaccin museum,rembrandt,schilderijen stad,utrecht,amsterdam
#26 - Napoleon napoleon,frankrijk,handtekening frankrijk,franse,fransen hitler,duitsers,wereldoorlog
#27 - Postzegels postzegels,postzegel,verzamelen duitsland,ddr,duitsers inflatie,financiële,economen
#28 - Duitsland (deel 1) duitsland,ddr,duitsers trump,republikeinen,biden vvd,partij,cda
#29 - Coronaprik & Duitsland (deel 2) duitsland,ddr,duitsers merkel,duitsland,bondskanselier inflatie,financiële,economen
#30 - Vaccinvoordringer?! vvd,partij,cda podcast,luisteren,podcasts boeren,trekkers,agrarische
#31 - Tragiek van neoliberalisme inflatie,financiële,economen rijden,auto,rijdt vvd,partij,cda
#32 - Reflecteren inflatie,financiële,economen china,taiwan,chinezen gevaccineerd,vaccineren,vaccin
#33 - Flikker nou op rutte,kabinet,motie vvd,partij,cda belasting,betalen,overheid
#34 - De Beste trump,republikeinen,biden inflatie,financiële,economen zwarte,slavernij,zuidelijke
#35 - De Sigaar van Bill irak,saddam,hussein china,taiwan,chinezen duitsland,ddr,duitsers
#36 - Terrasje trump,republikeinen,biden zwarte,slavernij,zuidelijke vakantie,hotel,park
#37 - Terreur irak,saddam,hussein china,taiwan,chinezen vliegen,vliegtuig,piloot
#38 - 'Neger in Witte Huis' trump,republikeinen,biden china,taiwan,chinezen inflatie,financiële,economen
#39 - Wappies trump,republikeinen,biden china,taiwan,chinezen iran,israël,cuba
#40 - Domme schapen onderwijs,school,geschiedenis duitsland,ddr,duitsers merkel,duitsland,bondskanselier
#41 - Pislucht duitsland,ddr,duitsers vakantie,hotel,park minister,kabinet,president
#42 - Omtzigt ongeschikt laptop,koffertje,camera vvd,partij,cda gevaccineerd,vaccineren,vaccin
#43 - Linkse lul minister,kabinet,president vvd,partij,cda programma,tv,televisie
#44 - Seksboekjes vvd,partij,cda roken,sigaretten,sigaret heilig,kerk,jezus
#45 - Klote voetbal vvd,partij,cda minister,kabinet,president voetballen,voetbal,sport
#46 - Besmet met deltavariant vvd,partij,cda geld,pensioen,banken gevaccineerd,vaccineren,vaccin
#47 - Kogel voor Peter china,taiwan,chinezen inflatie,financiële,economen vvd,partij,cda
#48 - Dom, dommer, domst vvd,partij,cda rutte,kabinet,motie inflatie,financiële,economen
#49 - Populisme vvd,partij,cda nederland,belgië,vlaanderen minister,kabinet,president
#50 - Asociale eikel vvd,partij,cda energie,planeet,fossiele water,moeras,west
#51 - Klimaatontkenner inflatie,financiële,economen energie,planeet,fossiele onderwijs,school,geschiedenis
#52 - Bedreigd vvd,partij,cda rutte,kabinet,motie minister,kabinet,president
#53 - Lekker ergeren voetballen,voetbal,sport hitler,duitsers,wereldoorlog bevolking,nederland,welvaart
#54 - Hitler hitler,duitsers,wereldoorlog duitsland,ddr,duitsers china,taiwan,chinezen
#55 - Negeer de wet gevaccineerd,vaccineren,vaccin china,taiwan,chinezen rijden,auto,rijdt
#56 - Der Führer schläft hitler,duitsers,wereldoorlog duitsers,piloten,toestellen frankrijk,franse,fransen
#57 - Ontgroening vakantie,hotel,park afghanistan,taliban,kabul trump,republikeinen,biden
#58 - Poesje duitsers,piloten,toestellen auto,ford,motor hitler,duitsers,wereldoorlog
#59 - Polen hitler,duitsers,wereldoorlog oekraïne,rusland,poetin podcast,luisteren,podcasts
#60 - Sukkeltje hitler,duitsers,wereldoorlog china,taiwan,chinezen duitsers,piloten,toestellen
#61 - Vliegschaamte hitler,duitsers,wereldoorlog trein,spoor,station podcast,luisteren,podcasts
#62 - Netflix hitler,duitsers,wereldoorlog programma,tv,televisie tank,tanks,tiger
#63 - Verkrachter vvd,partij,cda afghanistan,taliban,kabul china,taiwan,chinezen
#64 - Vaccinatiedwang hitler,duitsers,wereldoorlog merkel,duitsland,bondskanselier gevaccineerd,vaccineren,vaccin
#65 - BBB-mevrouw vvd,partij,cda rita,kaag,verdonk fortuyn,melkert,pim
#66 - Bin Laden wint trump,republikeinen,biden theater,publiek,uur irak,saddam,hussein
#67 - Joden hitler,duitsers,wereldoorlog merkel,duitsland,bondskanselier onderwijs,school,geschiedenis
#68 - Fascist hitler,duitsers,wereldoorlog mussolini,italië,fascisme auto,ford,motor
#69 - Rutte kust Kaag vvd,partij,cda kabinet,transparantie,parlement rutte,kabinet,motie
#70 - Auto auto,ford,motor onderwijs,school,geschiedenis irak,saddam,hussein
#71 - Aanval auto,ford,motor vvd,partij,cda china,taiwan,chinezen
#72 - Amsterdam auto,ford,motor stad,utrecht,amsterdam auto,steden,pick
#73 - Welvaartsbuikje auto,ford,motor tank,tanks,tiger eten,eet,vlees
#74 - Steenkolen Engels vvd,partij,cda leipzig,duitsland,duits onderwijs,school,geschiedenis
#75 - Lullepot auto,ford,motor rijden,auto,rijdt boek,lezen,boeken
#76 - Facebook gevaccineerd,vaccineren,vaccin china,taiwan,chinezen geld,pensioen,banken
#77 - File programma,tv,televisie auto,ford,motor boek,lezen,boeken
#78 - Joe York auto,ford,motor auto,tesla,elektrische sneeuw,koud,herfst
#79 - Onhandig stoommachine,stoommachines,water sievert,siewert,tuu licht,gloeilamp,led
#80 - Lijstjes boek,lezen,boeken kabinet,transparantie,parlement podcast,luisteren,podcasts
#81 - Provinciaal programma,tv,televisie trump,republikeinen,biden belasting,betalen,overheid
#82 - Jezus heilig,kerk,jezus onderwijs,school,geschiedenis vrouwen,emancipatie,mannen
#83 - Mini auto,ford,motor boek,lezen,boeken auto,tesla,elektrische
#84 - China china,taiwan,chinezen amerika,europa,staten voetballen,voetbal,sport
#85 - Xi Jinping china,taiwan,chinezen gevaccineerd,vaccineren,vaccin boeren,trekkers,agrarische
#86 - Per seconde wijzer gevaccineerd,vaccineren,vaccin china,taiwan,chinezen telescoop,aarde,maan
#87 - Maanlanding telescoop,aarde,maan boek,lezen,boeken nucleaire,wapens,bom
#88 - Verveling trump,republikeinen,biden oekraïne,rusland,poetin vvd,partij,cda
#89 - Het OV auto,ford,motor auto,steden,pick trein,spoor,station
#90 - Zeikneus boek,lezen,boeken boeken,amazon,com godfried,thorbecke,bommans
#91 - Seksprofessor boek,lezen,boeken onderwijs,school,geschiedenis oma,vader,opa
#92 - Pokémon boek,lezen,boeken eiland,walvis,zee china,taiwan,chinezen
#93 - Lijstduwer rijden,auto,rijdt vvd,partij,cda boek,lezen,boeken
#94 - Trippel Trappel auto,ford,motor auto,tesla,elektrische vliegen,vliegtuig,piloot
#95 - Gerri Eickhof zwarte,slavernij,zuidelijke vrouwen,mannen,meisjes voetballen,voetbal,sport
#96 - Kneusje Baudet gevaccineerd,vaccineren,vaccin kabinet,transparantie,parlement twitter,media,facebook
#97 - Duurzaam gelul boek,lezen,boeken eiland,walvis,zee godfried,thorbecke,bommans
#98 - Wildplassen boek,lezen,boeken voetballen,voetbal,sport stad,utrecht,amsterdam
#99 - Vrouwen voetballen,voetbal,sport gevaccineerd,vaccineren,vaccin boek,lezen,boeken
#100 - Kolonie roken,sigaretten,sigaret onderwijs,school,geschiedenis mussolini,italië,fascisme
#101 - Vietnamoorlog vietnam,vietcong,minh frankrijk,franse,fransen rijden,auto,rijdt
#102 - Schelden krant,nrc,lees water,moeras,west vietnam,vietcong,minh
#103 - Comeback onderwijs,school,geschiedenis vvd,partij,cda nederland,belgië,vlaanderen
#104 - Beste Mensen vietnam,vietcong,minh gevaccineerd,vaccineren,vaccin museum,rembrandt,schilderijen
#105 - Peace with Honor oekraïne,rusland,poetin vietnam,vietcong,minh irak,saddam,hussein
#106 - Max Verstappen voetballen,voetbal,sport onderwijs,school,geschiedenis gevaccineerd,vaccineren,vaccin
#107 - Positief getest vliegen,vliegtuig,piloot mussolini,italië,fascisme boek,lezen,boeken
#108 - Jeugd in Wageningen tank,tanks,tiger boek,lezen,boeken programma,tv,televisie
#109 - Cancelcultuur zwarte,slavernij,zuidelijke twitter,media,facebook napoleon,frankrijk,handtekening
#110 - Drugs tank,tanks,tiger twitter,media,facebook trump,republikeinen,biden
#111 - Top 2000 cocaïne,legalisering,alcohol voetballen,voetbal,sport bier,thee,drinken
#112 - Loterij stad,utrecht,amsterdam krant,nrc,lees energie,planeet,fossiele
#113 - LTS zwakstroom boek,lezen,boeken godfried,thorbecke,bommans hitler,duitsers,wereldoorlog
#114 - Nieuw kabinet minister,kabinet,president vakantie,hotel,park dirigent,meta,schumacher
#115 - Militaire dienst podcast,luisteren,podcasts roken,sigaretten,sigaret tank,tanks,tiger
#117 - Seksueel wangedrag vvd,partij,cda oekraïne,rusland,poetin rutte,kabinet,motie
#118 - Valt Poetin Oekraïne binnen? oekraïne,rusland,poetin gas,rusland,poetin china,taiwan,chinezen
#119 - Amerikaanse hoogmoed trump,republikeinen,biden irak,saddam,hussein afghanistan,taliban,kabul
#120 - BOOS programma,tv,televisie onderwijs,school,geschiedenis baby,bevolking,mannen
#121 - Poetin valt niet aan oekraïne,rusland,poetin voetballen,voetbal,sport sneeuw,koud,herfst
#122 - Geopolitiek china,taiwan,chinezen hitler,duitsers,wereldoorlog oekraïne,rusland,poetin
#123 - Linda de Mol gas,rusland,poetin inflatie,financiële,economen oekraïne,rusland,poetin
#124 - Herinnert u zich deze nog? onderwijs,school,geschiedenis schrijven,schrijf,woorden oekraïne,rusland,poetin
#125 - Kernwapen nucleaire,wapens,bom hitler,duitsers,wereldoorlog energie,planeet,fossiele
#126 - Leven zonder Google Maps onderwijs,school,geschiedenis telefoon,mobiele,iphone vakantie,hotel,park
#127 - Bedreiging voor China china,taiwan,chinezen roken,sigaretten,sigaret oekraïne,rusland,poetin
#128 - Pijpen roken,sigaretten,sigaret licht,gloeilamp,led kinderen,ouders,jongetjes
#129 - Russische blufpoker oekraïne,rusland,poetin afghanistan,taliban,kabul baudet,thierry,wilders
#130 - Versoepelen gevaccineerd,vaccineren,vaccin inflatie,financiële,economen vliegen,vliegtuig,piloot
#131 - 🇺🇸 USA Roadtrip I vakantie,hotel,park sneeuw,koud,herfst eten,eet,vlees
#132 - 🇺🇸 USA Roadtrip II vakantie,hotel,park stad,utrecht,amsterdam vvd,partij,cda
#133 - Biden blaft maar bijt niet oekraïne,rusland,poetin telefoon,mobiele,iphone china,taiwan,chinezen
#134 - Lil' Kleine onderwijs,school,geschiedenis trein,spoor,station vliegen,vliegtuig,piloot
#135 - Hij ziet ze vliegen vliegen,vliegtuig,piloot schiphol,klm,luchthaven duitsers,piloten,toestellen
#136 - Censuur telefoon,mobiele,iphone auto,tesla,elektrische rijden,auto,rijdt
#137 - Oorlog oekraïne,rusland,poetin gas,rusland,poetin irak,saddam,hussein
#138 - Escalatie oekraïne,rusland,poetin china,taiwan,chinezen iran,israël,cuba
#139 - Lichtpuntjes licht,gloeilamp,led theater,publiek,uur vvd,partij,cda
#140 - Wie stopt Poetin? oekraïne,rusland,poetin roken,sigaretten,sigaret vliegen,vliegtuig,piloot
#141 - Spijt stad,utrecht,amsterdam rutte,kabinet,motie uur,douchegordijn,balletjes
#142 - Speel Rusland en China uit elkaar oekraïne,rusland,poetin china,taiwan,chinezen gas,rusland,poetin
#143 - Bloedbad oekraïne,rusland,poetin tank,tanks,tiger gas,rusland,poetin
#144 - Poetin vs Mussolini mussolini,italië,fascisme hitler,duitsers,wereldoorlog godfried,thorbecke,bommans
#145 - Russisch perspectief oekraïne,rusland,poetin vliegen,trein,rij vliegen,vliegtuig,piloot
#146 - Verhaal van Nederland zwarte,slavernij,zuidelijke vrouwen,mannen,meisjes vrouwen,emancipatie,mannen
#147 - Ontroerd oekraïne,rusland,poetin irak,saddam,hussein beren,stofwisseling,bellen
#148 - Stemrecht vvd,partij,cda rita,kaag,verdonk vrouw,kaag,joke
#149 - Kremlin trekpop vvd,partij,cda oekraïne,rusland,poetin stad,utrecht,amsterdam
#150 - Komt er vrede? trump,republikeinen,biden trein,spoor,station oekraïne,rusland,poetin
#151 - Is Poetin der Führer? hitler,duitsers,wereldoorlog licht,gloeilamp,led oekraïne,rusland,poetin
#152 - Kiezer sloopt democratie vvd,partij,cda voetballen,voetbal,sport duitsland,ddr,duitsers
#153 - Oliecrisis oekraïne,rusland,poetin china,taiwan,chinezen programma,tv,televisie
#154 - Voorkeurstem password,qr,paswoord stad,utrecht,amsterdam vvd,partij,cda
#155 - Wanneer grijpt NAVO in? oekraïne,rusland,poetin gorbachev,gorbatschow,sovjet trein,spoor,station
#156 - Zorgt Poetin voor babyboom? oekraïne,rusland,poetin nederland,belgië,vlaanderen baby,bevolking,mannen
#157 - Sorry Gijp boek,lezen,boeken vvd,partij,cda telescoop,aarde,maan
#158 - Pim Fortuyn vvd,partij,cda fortuyn,melkert,pim minister,kabinet,president
#159 - Sywert & Hugo oekraïne,rusland,poetin voetballen,voetbal,sport programma,tv,televisie
#160 - De tank oekraïne,rusland,poetin tank,tanks,tiger auto,ford,motor
#161 - Annexatie van Brabant tank,tanks,tiger oekraïne,rusland,poetin gas,rusland,poetin
#162 - Churchill churchill,winston,prime charles,koningin,elisabeth leven,overleden,oud
#163 - Zelensky oekraïne,rusland,poetin onderwijs,school,geschiedenis merkel,duitsland,bondskanselier
#164 - Uitweg uit oorlog oekraïne,rusland,poetin auto,tesla,elektrische licht,gloeilamp,led
#165 - Is democratie beste systeem? oekraïne,rusland,poetin vvd,partij,cda amerika,europa,staten
#166 - Verruwing boeren,trekkers,agrarische muziek,radio,klassieke geld,pensioen,banken
#167 - Held hitler,duitsers,wereldoorlog churchill,winston,prime duitsers,piloten,toestellen
#168 - Mailtjes van Hugo oekraïne,rusland,poetin krant,nrc,lees leven,overleden,oud
#169 - Pechgeneratie china,taiwan,chinezen oekraïne,rusland,poetin stad,utrecht,amsterdam
#170 - Cash oekraïne,rusland,poetin geld,pensioen,banken password,qr,paswoord
#171 - Propaganda oekraïne,rusland,poetin hitler,duitsers,wereldoorlog boek,lezen,boeken
#172 - Geneefse Conventie oekraïne,rusland,poetin nederland,belgië,vlaanderen duitsland,ddr,duitsers
#173 - Gifgas nederland,belgië,vlaanderen krant,nrc,lees vvd,partij,cda
#174 - Inloggen, uitloggen napoleon,frankrijk,handtekening password,qr,paswoord onderwijs,school,geschiedenis
#175 - Cocaïne onderwijs,school,geschiedenis cocaïne,legalisering,alcohol krant,nrc,lees
#176 - Deze wapens gebruikt Oekraïne oekraïne,rusland,poetin tank,tanks,tiger irak,saddam,hussein
#177 - Een nieuwe ijstijd water,moeras,west energie,planeet,fossiele programma,tv,televisie
#178 - De enige Nederlandse paus godfried,thorbecke,bommans heilig,kerk,jezus vvd,partij,cda
#179 - Na de moord onderwijs,school,geschiedenis minister,kabinet,president boek,lezen,boeken
#180 - Schiphol rijden,auto,rijdt geld,pensioen,banken krant,nrc,lees
#181 - Duitsland schaamt zich oekraïne,rusland,poetin boek,lezen,boeken gevaccineerd,vaccineren,vaccin
#182 - Is Kaag nog betrouwbaar? heilig,kerk,jezus kabinet,transparantie,parlement podcast,luisteren,podcasts
#183 - Thorbecke godfried,thorbecke,bommans vvd,partij,cda leven,overleden,oud
#184 - Monarchie oekraïne,rusland,poetin vakantie,hotel,park vliegen,vliegtuig,piloot
#185 - Staatsgreep charles,koningin,elisabeth kinderen,ouders,jongetjes vakantie,hotel,park
#186 - Elon Musk twitter,media,facebook podcast,luisteren,podcasts None
#187 - Hebben we relatie met Rusland zelf verpest? china,taiwan,chinezen oekraïne,rusland,poetin iran,israël,cuba
#188 - Gitzwart scenario Oekraïne oekraïne,rusland,poetin vrouwen,mannen,meisjes None
#189 - Nazi's vs Russen oekraïne,rusland,poetin godfried,thorbecke,bommans gorbachev,gorbatschow,sovjet
#190 - LHBTI+'ers stad,utrecht,amsterdam krant,nrc,lees podcast,luisteren,podcasts
#191 - Kogel van links minister,kabinet,president hitler,duitsers,wereldoorlog bier,thee,drinken
#192 - Onafhankelijk trump,republikeinen,biden china,taiwan,chinezen vakantie,hotel,park
#193 - Sis van Rossem dood,leven,roman onderwijs,school,geschiedenis stad,utrecht,amsterdam
#194 - Poetins toespraak oekraïne,rusland,poetin hitler,duitsers,wereldoorlog gorbachev,gorbatschow,sovjet
#195 - De media stad,utrecht,amsterdam neoliberale,overheid,beleid vvd,partij,cda
#196 - Johan Derksen fortuyn,melkert,pim oekraïne,rusland,poetin programma,tv,televisie
#197 - Afscheid oekraïne,rusland,poetin belasting,betalen,overheid eten,eet,vlees
#198 - Wat ging er mis in Oekraïne? oekraïne,rusland,poetin gorbachev,gorbatschow,sovjet None
#199 - Vandaag Inside rijden,auto,rijdt oekraïne,rusland,poetin stad,utrecht,amsterdam
#200 - Schuilkelder oekraïne,rusland,poetin boek,lezen,boeken onderwijs,school,geschiedenis
#201 - Verrot en beschimmeld auto,ford,motor twitter,media,facebook oekraïne,rusland,poetin
#202 - Sms'jes van Mark juryrechtspraak,overheid,rechter krant,nrc,lees rijden,auto,rijdt
#203 - Intellectueel gelul onderwijs,school,geschiedenis boek,lezen,boeken vvd,partij,cda
#204 - Hoe Poetin radicaliseerde oekraïne,rusland,poetin gas,rusland,poetin irak,saddam,hussein
#205 - Het masterplan van Poetin oekraïne,rusland,poetin korea,noord,oorlog china,taiwan,chinezen
#206 - Hemelvaart trein,spoor,station stad,utrecht,amsterdam rijden,auto,rijdt
#207 - Liefdesbaby van Thierry oekraïne,rusland,poetin juryrechtspraak,overheid,rechter onderwijs,school,geschiedenis
#208 - Amerikaanse wapencultuur vuurwapens,vuurwapen,wapenvergunning zwarte,slavernij,zuidelijke trump,republikeinen,biden
#209 - Onbeleefde hufter irak,saddam,hussein rijden,auto,rijdt telefoon,mobiele,iphone
#210 - Volkswagen busje auto,ford,motor rijden,auto,rijdt vakantie,hotel,park
#211 - Onderhandelen met Poetin oekraïne,rusland,poetin onderwijs,school,geschiedenis voetballen,voetbal,sport
#212 - Keerzijde van macht geld,pensioen,banken oekraïne,rusland,poetin twitter,media,facebook
#213 - Dienstplicht oma,vader,opa vrouwen,mannen,meisjes rutte,kabinet,motie
#214 - Erfenis van de nazi's roken,sigaretten,sigaret onderwijs,school,geschiedenis stad,utrecht,amsterdam
#215 - Schiphol ellende vakantie,hotel,park schiphol,klm,luchthaven zwarte,slavernij,zuidelijke
#216 - Klimaat Illusie energie,planeet,fossiele water,moeras,west china,taiwan,chinezen
#217 - Geen actieve herinnering onderwijs,school,geschiedenis oekraïne,rusland,poetin stad,utrecht,amsterdam
#218 - Rekening betaald programma,tv,televisie godfried,thorbecke,bommans boeren,trekkers,agrarische
#219 - Boeren boeren,trekkers,agrarische vvd,partij,cda rutte,kabinet,motie
#220 - Verhoren Capitoolbestorming trump,republikeinen,biden oekraïne,rusland,poetin rijden,auto,rijdt
#221 - Zo win je de oorlog duitsers,piloten,toestellen hitler,duitsers,wereldoorlog oekraïne,rusland,poetin
#222 - Einde aan globalisering? china,taiwan,chinezen energie,planeet,fossiele inflatie,financiële,economen
#223 - Spaargeld dino,velociraptors,skeletten energie,planeet,fossiele geld,pensioen,banken
#224 - Sophie Hermans boeren,trekkers,agrarische baudet,thierry,wilders minister,kabinet,president
#225 - Vakantie is een ziekte trump,republikeinen,biden schiphol,klm,luchthaven licht,gloeilamp,led
#226 - België oekraïne,rusland,poetin belasting,betalen,overheid nederland,belgië,vlaanderen
#227 - Battle of Britain duitsers,piloten,toestellen hitler,duitsers,wereldoorlog vakantie,hotel,park
#228 - Abortus trump,republikeinen,biden roken,sigaretten,sigaret juryrechtspraak,overheid,rechter
#229 - Hufters, die boeren! boeren,trekkers,agrarische schiphol,klm,luchthaven roken,sigaretten,sigaret
#230 - Oorlog met boeren boeren,trekkers,agrarische gevaccineerd,vaccineren,vaccin hitler,duitsers,wereldoorlog
#231 - Yvonne Coldeweijer vvd,partij,cda boeren,trekkers,agrarische twitter,media,facebook
#232 - De Tour oekraïne,rusland,poetin rijden,auto,rijdt boeren,trekkers,agrarische
#233 - Twee levens gered stad,utrecht,amsterdam uur,douchegordijn,balletjes bevolking,nederland,welvaart
#234 - Boris Johnson vliegen,vliegtuig,piloot boeken,amazon,com vliegen,trein,rij
#235 - Telefoon telefoon,mobiele,iphone nederland,belgië,vlaanderen vrouwen,mannen,meisjes
#236 - Met de trein trein,spoor,station china,taiwan,chinezen podcast,luisteren,podcasts
#237 - Noord- en Zuid-Korea 🇰🇷 korea,noord,oorlog china,taiwan,chinezen boeren,trekkers,agrarische
#238 - Op reis dino,velociraptors,skeletten eten,eet,vlees stad,utrecht,amsterdam
#239 - Marcel van Roosmalen trump,republikeinen,biden voetballen,voetbal,sport bier,thee,drinken
#240 - Dier gedood programma,tv,televisie twitter,media,facebook rijden,auto,rijdt
#241 - Draghi weg, Rutte blijft kabinet,transparantie,parlement belasting,betalen,overheid trein,spoor,station
#242 - Met dank aan Hitler auto,ford,motor auto,steden,pick hitler,duitsers,wereldoorlog
#243 - De hel die Schiphol heet vakantie,hotel,park vliegen,vliegtuig,piloot schiphol,klm,luchthaven
#244 - De val van Rutte vvd,partij,cda rutte,kabinet,motie oekraïne,rusland,poetin
#245 - Ruzie op vakantie museum,rembrandt,schilderijen vliegen,trein,rij auto,steden,pick
#246 - Achter de schermen dino,velociraptors,skeletten programma,tv,televisie eiland,walvis,zee
#247 - Haatmail boeren,trekkers,agrarische stad,utrecht,amsterdam twitter,media,facebook
#248 - Mark Rutte: de recordpremier vvd,partij,cda minister,kabinet,president inflatie,financiële,economen
#249 - Provoceren schiphol,klm,luchthaven belasting,betalen,overheid twitter,media,facebook
#250 - Nieuwe oorlog trump,republikeinen,biden oekraïne,rusland,poetin zwarte,slavernij,zuidelijke
#251 - Kamervragen boeren,trekkers,agrarische vvd,partij,cda twitter,media,facebook
#252 - Droog, droger, droogst water,moeras,west dino,velociraptors,skeletten boek,lezen,boeken
#253 - Studententijd onderwijs,school,geschiedenis kinderen,ouders,jongetjes bier,thee,drinken
#254 - Ondankbare honden china,taiwan,chinezen oekraïne,rusland,poetin auto,ford,motor
#255 - Herverkiezing Trump trump,republikeinen,biden oekraïne,rusland,poetin vvd,partij,cda
#256 - ASML's Chipoorlog china,taiwan,chinezen oekraïne,rusland,poetin vliegen,trein,rij
#257 - U wordt armer gas,prijzen,energie stad,utrecht,amsterdam nederland,belgië,vlaanderen
#258 - Noem mij maar 'hen' vrouwen,emancipatie,mannen vvd,partij,cda nederland,belgië,vlaanderen
#259 - Bom onder kabinet? minister,kabinet,president vvd,partij,cda vakantie,hotel,park
#260 - Mislukte aanslag op Doegin o e k
#261 - Blunders china,taiwan,chinezen laptop,koffertje,camera stoommachine,stoommachines,water
#262 - Dunning-Kruger effect trump,republikeinen,biden vvd,partij,cda leipzig,duitsland,duits
#263 - Primeur zwarte,slavernij,zuidelijke baudet,thierry,wilders muziek,radio,klassieke
#264 - Asielzoeker in huis bevolking,nederland,welvaart energie,planeet,fossiele telescoop,aarde,maan
#265 - Festival-verslaafd vvd,partij,cda vrouw,kaag,joke onderwijs,school,geschiedenis
#266 - James Webb-telescoop telescoop,aarde,maan heilig,kerk,jezus leven,overleden,oud
#267 - De baard van Maarten oekraïne,rusland,poetin programma,tv,televisie vakantie,hotel,park
#268 - Keerzijde van Max' succes voetballen,voetbal,sport auto,ford,motor stad,utrecht,amsterdam
#269 - Tragische ondergang oekraïne,rusland,poetin gorbachev,gorbatschow,sovjet baby,bevolking,mannen
#270 - Gas als Wapen oekraïne,rusland,poetin vrouwen,emancipatie,mannen sneeuw,koud,herfst
#271 - Verheven boven het volk bevolking,nederland,welvaart gas,prijzen,energie telescoop,aarde,maan
#272 - The Queen 👑 charles,koningin,elisabeth vrouw,kaag,joke programma,tv,televisie
#273 - Opmars Oekraïne oekraïne,rusland,poetin auto,tesla,elektrische korea,noord,oorlog
#274 - Wie is de NSB'er? trump,republikeinen,biden rutte,kabinet,motie amerika,europa,staten
#275 - Staken loont gas,prijzen,energie teruggebeld,afspraak,telefoonnummers rijden,auto,rijdt
#276 - Begrafenis van de eeuw 💀 charles,koningin,elisabeth dirigent,meta,schumacher onderwijs,school,geschiedenis
#277 - Mocro's ontvoeren Rutte cocaïne,legalisering,alcohol eten,eet,vlees roken,sigaretten,sigaret
#278 - Operatie Market Garden hitler,duitsers,wereldoorlog duitsers,piloten,toestellen gevaccineerd,vaccineren,vaccin
#279 - Poetins Waterloo oekraïne,rusland,poetin onderwijs,school,geschiedenis irak,saddam,hussein
#280 - Mobilisatie chaos oekraïne,rusland,poetin mussolini,italië,fascisme stad,utrecht,amsterdam
#281 - Toekomst voorspellen faraday,einstein,maxwell eiland,walvis,zee licht,gloeilamp,led
#282 - Knettergek museum,rembrandt,schilderijen baudet,thierry,wilders vvd,partij,cda
#283 - Derde Wereldoorlog oekraïne,rusland,poetin gas,rusland,poetin telescoop,aarde,maan
#284 - Mes in je rug geld,pensioen,banken mussolini,italië,fascisme neoliberale,overheid,beleid
#285 - Veiligheidsdilemma water,moeras,west stad,utrecht,amsterdam geld,pensioen,banken
#286 - Scheiße trein,spoor,station leipzig,duitsland,duits teruggebeld,afspraak,telefoonnummers
#287 - Rode knop oekraïne,rusland,poetin trein,spoor,station teruggebeld,afspraak,telefoonnummers
#288 - Poetins zelfmoord oekraïne,rusland,poetin geld,pensioen,banken hitler,duitsers,wereldoorlog
#289 - Totale vernietiging oekraïne,rusland,poetin teruggebeld,afspraak,telefoonnummers nucleaire,wapens,bom
#290 - Bel Remkes dirigent,meta,schumacher programma,tv,televisie auto,ford,motor
#291 - Grootste gevangenis ter wereld auto,ford,motor gas,prijzen,energie vakantie,hotel,park
#292 - Profiteren van ellende vakantie,hotel,park inflatie,financiële,economen oekraïne,rusland,poetin
#293 - Cubacrisis iran,israël,cuba oekraïne,rusland,poetin onderwijs,school,geschiedenis
#294 - Fittie met Gijp trump,republikeinen,biden fortuyn,melkert,pim programma,tv,televisie
#295 - Vakantie hitler,duitsers,wereldoorlog kabouter,knol,meiland minister,kabinet,president
#296 - VK stort in china,taiwan,chinezen cocaïne,legalisering,alcohol vvd,partij,cda
#297 - De onderbuik vvd,partij,cda voetballen,voetbal,sport vakantie,hotel,park
#298 - Complotdenkers oekraïne,rusland,poetin hitler,duitsers,wereldoorlog korea,noord,oorlog
#299 - Zelfvernietiging inflatie,financiële,economen gas,prijzen,energie china,taiwan,chinezen
#300 - Cocaïne legaliseren cocaïne,legalisering,alcohol eten,eet,vlees krant,nrc,lees
#301 - Klimaatflop boek,lezen,boeken krant,nrc,lees energie,planeet,fossiele
#302 - Moord op Poetin oekraïne,rusland,poetin trump,republikeinen,biden baudet,thierry,wilders
#303 - Excuses maken juryrechtspraak,overheid,rechter zwarte,slavernij,zuidelijke voetballen,voetbal,sport
#304 - Knuffelen met China china,taiwan,chinezen oekraïne,rusland,poetin energie,planeet,fossiele
#305 - Midterms inflatie,financiële,economen trump,republikeinen,biden oekraïne,rusland,poetin
#306 - Tank in de oorlog tank,tanks,tiger hitler,duitsers,wereldoorlog duitsers,piloten,toestellen
#307 - Vernedering hitler,duitsers,wereldoorlog duitsland,ddr,duitsers tank,tanks,tiger
#308 - Trump gaat eraan! trump,republikeinen,biden china,taiwan,chinezen vakantie,hotel,park
#309 - VVD-implosie vvd,partij,cda twitter,media,facebook dirigent,meta,schumacher
#310 - Aanval op Kremlin china,taiwan,chinezen stad,utrecht,amsterdam bevolking,nederland,welvaart
#311 - Maartens wens voor hij doodgaat theater,publiek,uur tank,tanks,tiger faraday,einstein,maxwell
#312 - Matthijs van Nieuwkerk programma,tv,televisie krant,nrc,lees vakantie,hotel,park
#313 - Trumps ondergang trump,republikeinen,biden china,taiwan,chinezen vvd,partij,cda
#314 - Invasie van Taiwan china,taiwan,chinezen iran,israël,cuba gevaccineerd,vaccineren,vaccin
#315 - Totale halvegaren charles,koningin,elisabeth auto,ford,motor programma,tv,televisie
#316 - Eureka! stoommachine,stoommachines,water telescoop,aarde,maan onderwijs,school,geschiedenis
#317 - Slavernij gelul vrouw,kaag,joke zwarte,slavernij,zuidelijke voetballen,voetbal,sport
#318 - Grote loser oekraïne,rusland,poetin programma,tv,televisie boek,lezen,boeken
#319 - Radioactieve straling onderwijs,school,geschiedenis stoommachine,stoommachines,water gevaccineerd,vaccineren,vaccin
#320 - Vichy-regime frankrijk,franse,fransen hitler,duitsers,wereldoorlog china,taiwan,chinezen
#321 - Energietransitie water,moeras,west vvd,partij,cda onderwijs,school,geschiedenis
#322 - Etterende zweer oekraïne,rusland,poetin china,taiwan,chinezen gas,rusland,poetin
#323 - Uitgeschakeld! edison,gelijkstroom,tesla vvd,partij,cda stoommachine,stoommachines,water
#324 - Coup rijden,auto,rijdt voetballen,voetbal,sport programma,tv,televisie
#325 - Bevelhebber van Europa oekraïne,rusland,poetin gevaccineerd,vaccineren,vaccin kabinet,transparantie,parlement
#326 - De Wet van Faraday faraday,einstein,maxwell edison,gelijkstroom,tesla stoommachine,stoommachines,water
#327 - ChatGPT boek,lezen,boeken schrijven,schrijf,woorden faraday,einstein,maxwell
#328 - Sorry voor de slaven oekraïne,rusland,poetin podcast,luisteren,podcasts zwarte,slavernij,zuidelijke
#329 - Pak de macht! juryrechtspraak,overheid,rechter onderwijs,school,geschiedenis podcast,luisteren,podcasts
#330 - Gouden Eeuw edison,gelijkstroom,tesla licht,gloeilamp,led stoommachine,stoommachines,water

7 What’s next?

If you’ve reached this point, congratulations! You’ve reached the end. With all this data there is a lot more we could do. We could do even more analysing of this data, or we could leverage it to try and build a Maarten chatbot for fun. If that were the case we should ask their permission first. Perhaps Maarten and Tom can tell us what they think of this project, and whether there is something they would like to see?

Thanks for reading, and see you next time!